C++ 异常详解
1. 传统 C 风格的错误处理:为何需要异常?
C 语言中错误处理常见两种做法:
- 终止程序(如
assert为false时直接终止程序):缺陷:并不能明确知道是什么错误,用户难以接收错误信息- 内存错误(数组越界,未初始化/空指针/无效地址的访问,野指针,内存泄露,同一块空间释放多次等等)
- 除 0 错误,会直接终止程序
- 返回错误码(需配合
errno),缺陷:需要调用者层层检查和传递对应的错误,既繁琐又易出错- 如系统的很多库的接口函数都是通过把错误码放到 errno 中,表示错误
- 实际工程里,多数选择返回错误码,极少数'致命错误'直接终止。
- 实际工程中,C 语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误
小结: 当函数调用链很深时,错误码方案要求'层层返回',既污染业务逻辑,又容易遗漏。
- 异常机制正是为解决此类痛点而生,异常不会终止程序,并且会将错误信息详细介绍。
- 先感受一下异常:
double Division(int a, int b){if(b == 0) throw "Division by zero condition!"; else return ((double)a / (double)b);}
void Func(){int len, time; cin >> len >> time; cout << Division(len, time) << endl;}
int main(){//Func(); try{ Func(); }catch(const char* errmsg){ cout <<"异常已捕获:"<< errmsg << endl;}catch(...){ cout <<"unkown exception"<< endl;}return 0;}
不使用异常,传统 C 语言直接终止程序
使用异常捕获除 0 错误,显示出异常的信息
2. C++ 异常的概念
异常是面向对象语言处理错误的一种方式,当一个函数发现自己无法处理的错误时,可以抛出异常,让函数的直接或间接的调用者处理这个错误。异常的抛出和捕获由以下三个关键字配合完成:


