异常不是错误,异常是程序中可预料到的另一条执行分支,是可预见的。错误是不可预料的。
C++内置了异常处理的语法元素try...catch...,如下:
C++通过throw语句抛出异常信息:
上图中throw 0抛出异常后,程序就立即返回了。return代表正常的返回,throw代表异常的返回值。
C++异常处理分析:
throw抛出的异常必须被catch处理
当前函数能够处理异常,程序继续往下执行
当前函数无法处理异常,则函数停止执行并返回
未被处理的异常则顺着函数调用栈向上传播:
异常的示例程序如下:
1 #include <iostream> 2 3 using namespace std; 4 5 double divide(double a, double b) 6 { 7 const double delta = 0.000000000000001; 8 double ret = 0; 9 10 if( !((-delta < b) && (b < delta)) ) { 11 ret = a / b; 12 } 13 else { 14 throw 0; // 产生除 0 异常 15 } 16 17 return ret; 18 } 19 20 int main() 21 { 22 cout << "main() begin " << endl; 23 24 try 25 { 26 divide(1, 0); 27 } 28 catch(...) 29 { 30 cout << "Divided by zero" << endl; 31 } 32 33 cout << "main() end " << endl; 34 return 0; 35 }
执行结果如下:
26行的异常被28行的catch捕获,处理完这个异常之后,程序继续向下执行,33行成功打印出信息。
更改程序如下:
1 #include <iostream> 2 3 using namespace std; 4 5 double divide(double a, double b) 6 { 7 const double delta = 0.000000000000001; 8 double ret = 0; 9 10 if( !((-delta < b) && (b < delta)) ) { 11 ret = a / b; 12 } 13 else { 14 throw 0; // 产生除 0 异常 15 } 16 17 return ret; 18 } 19 20 int main() 21 { 22 cout << "main() begin " << endl; 23 24 try 25 { 26 int c = divide(1, 0); 27 28 cout << "c = " << c << endl; 29 } 30 catch(...) 31 { 32 cout << "Divided by zero" << endl; 33 } 34 35 cout << "main() end " << endl; 36 return 0; 37 }
执行结果如下:
可以看到第28行的打印没有输出。
如果try中的语句没有发生异常,catch中的语句是不会执行的。