C++异常处理
try…catch…
- try语句处理正常代码逻辑
- catch语句处理异常情况
- try语句中的异常由对应的catch语句处理
try
{
double d = 1/0;
}
catch(...)
{
cout<<"Error"<<endl;
}
throw语句抛出异常
- throw抛出的异常必须被catch处理
- 当前函数能够处理异常,程序继续往下执行
- 当前函数无法处理异常,则函数停止执行,并返回
未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行
#include <iostream>
using namespace std;
double divide(double a,double b)
{
const double delta = 0.0000000000001;
double ret = 0;
if(!((-delta<b)&&(b<delta)))
{
ret = a/b;
}
else
{
throw 0;
}
return ret;
}
int main(int argc, char const *argv[])
{
try{
double r = divide(1,0);
cout<<"r = "<<r<<endl;
}catch(...){
cout<<"Divided by zero ....."<<endl;
}
return 0;
}
同一个try语句可以跟上多个catch语句
- catch语句可以定义具体处理的异常类型
- 不同类型的异常由不同的catch语句负责处理
- try语句中可以抛出任何类型的异常
- catch(…)用于处理所有类型的异常
- 任何异常都只能被捕获(catch)一次
异常处理的匹配规则
异常抛出后,至上而下严格匹配每一个catch语句处理的类型
try
{
throw 1;
}
catch(Type1 t1)
{
}
catch(Type1 t2)
{
}
...
catch(TypeN tn)
{
}
异常处理匹配时,不进行任何的类型转换
小结
- C++中直接支持异常处理的概念
- try…catch…是C++中异常处理的专用语句
- try语句处理正常逻辑,catch处理异常情况
- 同一个try语句可以跟上多个catch语句
- 异常处理必须严格匹配,不进行任何的类型转换
catch语句块中可以抛出异常
- catch中捕获的异常可以被重新解释后抛出
- 工程开发中使用这样方式统一异常类型
C++中的异常处理
-
异常的类型可以是自定义类类型
-
对于类类型异常的匹配依旧是至上而下严格匹配
-
赋值兼容性原则在异常匹配中依然适用
-
一般而言
- 匹配子类异常catch放在上部
- 匹配父类异常catch放在下部
-
在工程中会定义一系列的异常类
-
每个类代表工程中可能出现的一种异常类型
-
代码复用时可能需要重解释不同的异常类
-
在定义catch语句块时推荐使用引用作为参数
C++中异常类族
- C++标准库中提供了实用异常类族
- 标准库中的异常都是从exception类派生出来的
- exception类有两个主要分支
- logic_error
- 常用于程序中的可避免逻辑错误
- runtime_error
- 常用于程序中无法避免的恶型错误
- logic_error
小结
- catch语句中可以抛出异常
- 异常的类型可以是自定义类类型
- 赋值兼容性原则在异常匹配中依然适用
- 标准库中的异常都是从exception类派生的