1. C++内置的异常处理:try-catch
(1)try语句处理正常代码逻辑
(2)catch语句处理异常情况
(3)try语句中的异常由对应的catch语句处理,如果对应的catch中没有处理该异常,会自动继续沿函数调用栈向上被抛出。
2. C++通过throw语句抛出异常情况
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; }
3. C++异常处理分析
(1)throw抛出的异常必须被catch处理
①当前函数能够处理异常,程序继续往下执行
②当前函数无法处理异常,则函数停止执行,并返回
(2)异常处理的流程:未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。
【编程实验】C++异常处理初探
#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异常时,抛出整数0。 //因异常不在该函数处理,会向外层调用函数传递 } return ret; } int main() { try { //除0时由于divide函数抛出异常,而在函数内部那里又没有处理该异常,因此异常被继续抛出,到了main函数中 //调用函数的代码之处,而在这里异常被try-catch捕获会转向catch语句中,catch处理完后,会直接转向catch //语句的后面"return 0;"去执行。而不是转到调用函数的下一行语句(即cout << "r = " << r << endl;) double r = divide(1, 0); cout << "r = " << r << endl; } catch(...) { cout << "Divide by zero..." << endl; } return 0; }
4. 多个catch块
(1)catch语句可以定义捕获具体类型的异常(如处理int型、double型、自定义类型的异常等)
(2)不同类型的异常由不同的catch语句负责处理
(3)throw可以抛出任何类型的异常
(4)catch(…)用于处理所有类型的异常,必须放在所有的catch块之后。
(5)任何异常都只能被捕获(catch)一次。
5. 异常处理的匹配规则
(1)异常抛出后,至上而下严格匹配每一个catch语句处理的类型。
(2)异常处理匹配时,不进行任何的类型转换。
【编程实验】异常类型匹配
#include <iostream> #include <string> using namespace std; void Demo1() { try { throw 1; //1默认为整型,将从上至下严格匹配各catch,即catch(int c) //如果throw ‘c‘,将匹配catch(char c),注意不进行任何的类型转换! } catch(char c) { cout << "catch(char c):" << c << endl; } catch(short c) { cout << "catch(short c):" << c << endl; } catch(double c) { cout << "catch(double c):" << c << endl; } catch(int c) { cout << "catch(int c):" << c << endl; } catch(...) //所有异常,必须放在所有的catch之后,因为是自上而下匹配的 { cout << "catch(...)" << endl; } } void Demo2() { throw "SantaClaus"; //const char*类型 //throw string("SantaClaus"); //string类型 } int main() { Demo1(); try { Demo2(); } catch(char* s) { cout << "catch(char* s):" << s << endl; } catch(const char* s) { cout << "catch(const char* s):" << s << endl; } catch(string s) { cout << "catch(string s):" << s << endl; } return 0; } /*输出结果: catch(int c):1 catch(const char* s):SantaClaus */
6. 小结
(1)C++中直接支持异常处理的概念
(2)try…catch是C++中异常处理的专用语句
(3)try语句处理正常代码逻辑,catch语句处理异常情况。
(4)同一个try语句可以跟上多个catch语句
(5)异常处理必须严格匹配,不进行任何的类型转换。
时间: 2024-10-11 04:10:26