zoukankan      html  css  js  c++  java
  • C++笔记 —— 异常

    try/throw/catch的常见用法

    1.一般情况下用于异常处理

     1 class Div_Zero_Error{
     2 public:
     3     void ptint_error(){
     4         cout << "Error: Division by zero." << endl;
     5     }
     6 };
     7 
     8 class Nagative_Error{
     9     double num;
    10 public:
    11     Nagative_Error(double a):num(a){};
    12     void print_error(){
    13         cout << "Error: Input negative number(" << num << ")." << endl; 
    14     }
    15 };
    16 
    17 double read_nums(){
    18     double a, b;
    19     cin >> a >> b;
    20     if(b == 0) throw Div_Zero_Error();
    21     if(a < 0) throw Nagative_Error(a);
    22     if(b < 0) throw Nagative_Error(b);
    23     return a / b;
    24 }
    25 
    26 void read_and_print_nums(){
    27     double ans = read_nums();
    28     cout << "The result of a / b: " << ans <<  endl;
    29 }
    30 
    31 int main(){
    32     try{
    33         cout << "Please enter two positive numbers: a, b: ";
    34         read_and_print_nums();
    35     }
    36     catch(Div_Zero_Error & ex){
    37         ex.ptint_error();
    38     }
    39     catch(Nagative_Error & ex){
    40         ex.print_error();
    41     }
    42     catch(...){ // 捕获其他任何异常
    43         cout << "Error: Undefined." << endl;
    44     }
    45 }

    2.用于代替if else 写法,程序的可读性(主要是把判断条件和后面跟随的代码块分开,在if判断很多的时候可以用)

     1 class case1{};
     2 class case2{};
     3 class case3{};
     4 
     5 void func(){
     6     try{
     7         if(xxx) throw case1();
     8         if(xxx) throw case2();
     9         throw case3{}; // 这个用于代替else
    10     }
    11     catch(case1 & c){xxx}
    12     catch(case2 & c){xxx}
    13     catch(...){xxx} //相当于else中的代码块
    14 }

     3.异常也可以只抛出而不处理,这种情况经常在写一个类时使用。

     1 class Dimension_Error{};
     2 
     3 class Matrix{
     4 private:
     5     int row, col;
     6 public:
     7     Matrix(int row, int col){
     8         if(row <= 0) throw Dimension_Error();
     9         if(col <= 0) throw Dimension_Error();
    10         this->col = col;
    11         this->row = row;
    12     }
    13 };

    几点注意事项:

    1.抛出的异常不一定是要用户自定义的类,还可以是内置的类或者是简单数据类型(不过并不建议这么写)

    2.对于常见的错误,可以考虑继承<exception>或<stdexcept>中的异常

    3.如果最终抛出的异常没有被程序接住,异常会被抛到操作系统中,此时相当于exit()终止程序。

    4.如果try块后面跟随多个catch块, 要求子类异常的catch块在前,父类异常的catch块在后。如果顺序颠倒,子类异常的catch块将不会捕获任何错误。

    5.在try和throw中创建的异常只有等到相对应的catch块中执行完了才会被析构

  • 相关阅读:
    五一拆装机学习
    msgbox函数和inputbox函数应该注意的几点
    西游记(3)
    刚刚开通csdn
    c# 快捷键
    JavaBean的属性(Simple,Indexed,Bound,Constrained)【收藏】
    SQL查询语句使用【收藏】
    .NET 对实现IPersistStream接口的对象进行保存和读取
    创建控件数组
    常用数据库JDBC连接写法【收藏】
  • 原文地址:https://www.cnblogs.com/LC32/p/13221288.html
Copyright © 2011-2022 走看看