C++的异常处理机制
- (1)Why(异常处理机制的作用)
- (2)How(异常机制如何工作)
- A.抛出异常
- B.捕获异常
- C.处理异常
- D.传递异常
- (3)抛出异常
- A.栈展开
- B.析构函数和异常
- C.异常对象
- (4)捕获异常
- (4)处理异常
- A.构造函数的异常处理
- B.不抛出异常noexcept
- C.noexcept运算符
(1)Why(异常处理机制的作用)
异常处理机制的目标是在异常情况发生时,能够捕获并处理这些异常,使程序能够进行适当的恢复或终止,并提供相应的错误信息
通过使用异常处理机制,可以改善程序的健壮性和可维护性,使程序更加可靠和可预测
(2)How(异常机制如何工作)
A.抛出异常
通过使用 throw 关键字抛出一个异常对象。异常对象可以是内置类型、自定义类型或标准库提供的异常类的实例
B.捕获异常
try 和 catch 捕获异常,使用 try 块来捕获异常。try 块后跟一个或多个 catch 块,每个 catch 块用于捕获特定类型的异常
C.处理异常
当发生异常时,如果能够匹配到相应类型的 catch 块,程序将进入匹配的 catch 块, 并执行其中的异常处理代码。异常处理代码可以根据需要进行恢复操作、输出错误信 息、记录日志等
D.传递异常
如果一个异常没有在当前的 try-catch 块中得到捕获,它将被传递给上层调用的 try-catch 块,直到找到匹配的 catch 块或者到达程序的顶层
注意:一个异常如果没有被捕获到,它将终止程序的执行过程(调用标准库函数 terminate)
(3)抛出异常
A.栈展开
如果 try 语句块嵌套使用,其本质是一个栈展开的形式
B.析构函数和异常
析构函数一定会被执行,但是函数中负责释放资源的代码却可能因为异常而被跳过, 因此考虑使用类来管理资源是一个非常不错的选择,它能确保无论是否发生异常,都 能释放资源。所有的标准库类型都能确保它们的析构函数不会引发异常
C.异常对象
异常对象位于编译器所管理的空间当中,编译器确保无论最终调用哪个 catch 子块都能 访问该异常对象;当异常处理完毕后,异常对象被销毁
(4)捕获异常
- catch 的参数最好定义成引用类型
- catch 的参数类型存在继承关系时候,子孙类放在最前面
- 重新抛出:上一个catch处理完之后,catch会调用throw重新抛出传递给下一个catch
捕获所有异常:
一次性捕获所有异常 catch(…),可以与任意类型的异常匹配
(4)处理异常
A.构造函数的异常处理
当构造函数的初始值列表发生异常时,构造函数内的 try 语句还没有生效
B.不抛出异常noexcept
作用:用于指定某函数不跑出异常
位置:
C.noexcept运算符
用于判断函数时候抛出异常(函数后有没有被noexcept修饰)
说明:noexcept既是异常说明符也是运算符