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块中执行完了才会被析构

原文地址:https://www.cnblogs.com/LC32/p/13221288.html