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