1. try-catch语句
(1)try语句处理正常代码逻辑
(2)catch语句处理异常情况
(3)try语句中的异常由对应的catch语句处理
(4)C++通过throw语句抛出异常信息
2. C++异常处理分析
(1)throw抛出的异常必须被catch处理
①当前函数能够处理异常,程序继续往下执行
②当前函数无法处理异常,则函数停止执行,并返回。
(2)未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。
(3)同一个try语句可以跟上多个catch语句
①catch语句可以定义具体处理的异常类型
②不同类型的异常由不同的catch语句负责处理。
③try语句中可以抛出任何类型的异常
④catch(…)用于处理所有类型的异常
⑤任何异常都只能被捕获(catch)一次。
(4)异常处理的匹配规则
【编程实验】C++异常处理
//main.cpp
#include <iostream> using namespace std; double divide(double a, double b) { const double delta = 0.000000000000001; double ret = 0; if( !((-delta < b) && ( b < delta))){ ret = a / b; }else{ throw 0; //产生除0异常 } return ret; } //匹配规则(自上而下,严格匹配、不进行类型转换) void Demo1() { try{ throw 'c'; //抛出字符型的异常 }catch(int i){ cout << "catch(int i)" << endl; }catch(double d){ cout << "catch(double d)" << endl; }catch(char c){ //只能被这里的catch捕获 cout << "catch(char c)" << endl; } } void Demo2() { throw "Demo2"; //const char* } int main() { cout << "main() begin" << endl; try{ double c = divide(1, 0);//产生异常 cout <<"c = " << c << endl; //无法被执行到! }catch(...){ cout << "Divide by zero..." << endl; } Demo1(); try{ Demo2(); }catch(char* c){ cout << "catch(char* c)" << endl; }catch(const char* c){ cout << "catch(const char* c)" << endl; }catch(...){ cout << "catch(...)" << endl; } cout << "main() end" << endl; return 0; } /*输出结果 main() begin Divide by zero... catch(char c) catch(const char* c) main() end */
3. 小结
(1)C++中直接支持异常处理的概念
(2)try…catch…是C++中异常处理的专用语句
(3)try语句处理正常代码逻辑,catch语句处理异常情况
(4)同一个try语句可以跟上多个catch语句
(5)异常处理必须严格匹配,不进行任何的类型转换