C++异常处理

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
      • 常用于程序中无法避免的恶型错误

小结

  • catch语句中可以抛出异常
  • 异常的类型可以是自定义类类型
  • 赋值兼容性原则在异常匹配中依然适用
  • 标准库中的异常都是从exception类派生的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值