c++中的异常处理
异常的概念
程序在运行过程中可能产生异常
异常(Exception)与Bug的区别
异常是程序运行时可预料的执行分支
Bug是程序中的错误,是不被预期的运行方式
异常(Exception)和Bug的对比
异常
运行时产生除0的情况
需要打开的外部文件不存在
数组访问时越界
Bug
使用野指针
堆数组使用后未释放
选择排序无法处理长度为0的数组
c++内置了异常处理的语法元素try...catch...
try语句处理正常代码逻辑
catch语句处理异常情况
try语句中的异常由对应的catch语句处理
c++通过throw语句抛出异常信息
c++异常处理分析
throw抛出的异常必须被catch处理
当前函数能够处理异常,程序继续往下执行
当前函数无法处理异常,则函数停止执行,并返回
未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。
同一个try语句可以跟上多个catch语句
catch语句可以定义具体处理的异常类型
不同类型的异常由不同的catch语句负责处理
try语句中可以抛出任何类型的异常
catch(...)用于处理所有类型的异常
任何异常都只能被捕获(catch)一次
异常处理的匹配规则
异常抛出后,至上而下严格匹配每一个catch语句处理的类型
异常处理匹配时,不进行任何的类型转换
catch语句块中可以抛出异常
catch中抛出的异常需要外层的try...catch...捕获
异常的类型可以是自定义类类型
对于类类型异常的匹配依旧是至上而下严格匹配
赋值兼容性原则在异常匹配中依然适用
一般而言
匹配子类异常的catch放在上部
匹配父类异常的catch放在下部
在工程中会定义一系列的异常类
每个类代表工程中可能出现的一种异常类型
代码复用时可能需要重解释不同的异常类
在定义catch语句块时推荐使用引用作为参数
c++标准库中提供了实用异常类族
标准库中的异常都是从exception类派生的
exception类有两个主要的分支
logic_error
常用于程序中的可避免逻辑错误
runtime_error
常用于程序中无法避免的恶性错误
小结
catch语句块中可以抛出异常
异常的类型可以是自定义类类型
赋值兼容性原则在异常匹配中依然适用
标准库中的异常都是从exception类派生的