关于throw try catch

博客介绍了C++中try-catch块的异常跳转机制。try块内产生的throw会跳转到对应catch块;catch块内产生的throw会跳转到外层catch块,避免本层无限循环。若最终找不到匹配catch块,程序先调用terminate(),默认调用abort(),也可用set_terminate()修改。

如果在try块中(或者try块中的函数中,或者try块中的函数中的函数中。。。。)产生了throw,会跳转到该try块下面对应的catch块。这种情况没什么好说的,属于最一般的情况。


但是,如果在catch块中(或者catch块中的函数中,或者catch块中的函数中的函数中。。。)产生了throw,会跳转到该try-catch外层的catch块,也就是不会在本层的catch块中找匹配,这一机制的好处我个人认为是防止在一个try-catch块内无限循环跳转。


综合以上两种情况,这种机制总体运行如下:try块内引发的throw一定先会跳转到该try块对应的catch来寻找匹配,catch块如果再引发异常,就会到上一个层次寻找匹配的catch块,这导致异常一定会从底层到外层,内部到外部,最终如果找不到匹配的catch块,C++primer plug中描述如下:


未捕获异常不会导致程序立刻异常终止,程序将首先调用terminate()。默认情况下,terminate()将调用abort()。不过,可以用set_terminate()函数修改terminate()调用的函数。set_terminate()函数将不带任何参数且返回类型为void的函数名称(地址)作为参数,并返回该函数地址。总的来说,terminate()会调用最近一次set_terminate()的函数,如果没有,则调用默认的abort()。

### C++中throwtrycatch的异常处理机制 C++中的异常处理是一种控制流管理技术,用于处理程序运行时发生的错误。通过`try`可以包裹可能抛出异常的代码段,而`catch`则用于捕获并处理这些异常。`throw`语句用于显式地抛出一个异常[^1]。 #### 1. `try` `try`包含可能抛出异常的代码。如果在执行`try`的过程中发生异常,则会立即跳转到与异常类型匹配的第一个`catch`。如果没有异常发生,则直接执行完`try`后跳过所有`catch`[^3]。 ```cpp try { // 可能抛出异常的代码 mightGoWrong(); } ``` #### 2. `throw`语句 `throw`语句用于抛出一个异常。它可以抛出任何类型的值,包括内置类型(如`int`、`double`)或用户定义类型(如类对象)。当`throw`被执行时,程序会立即退出当前函数,并寻找能够处理该异常的`catch`。 ```cpp void mightGoWrong() { throw std::runtime_error("An error occurred"); // 抛出一个std::runtime_error类型的异常 } ``` #### 3. `catch` `catch`用于捕获并处理由`throw`抛出的异常。每个`catch`都指定一个异常类型,只有当`throw`抛出的异常类型与`catch`的类型匹配时,该`catch`才会被触发。如果没有任何`catch`能够匹配异常类型,则程序将终止。此外,还可以使用`catch(...)`来捕获所有类型的异常[^2]。 ```cpp catch (const std::exception& e) { std::cout << "Caught exception: " << e.what() << std::endl; // 捕获std::exception类型的异常 } catch (...) { std::cout << "Caught an unknown exception." << std::endl; // 捕获所有其他类型的异常 } ``` #### 4. 异常处理的完整示例 以下是一个完整的C++异常处理示例,展示了如何使用`try`、`throw`和`catch`: ```cpp #include <iostream> #include <stdexcept> // 包含std::runtime_error void mightGoWrong() { throw std::runtime_error("An error occurred"); } int main() { try { mightGoWrong(); // 可能抛出异常 } catch (const std::exception& e) { // 捕获std::exception及其派生类类型的异常 std::cout << "Caught exception: " << e.what() << std::endl; } catch (...) { // 捕获所有其他类型的异常 std::cout << "Caught an unknown exception." << std::endl; } return 0; } ``` 在这个示例中,`mightGoWrong()`函数抛出了一个`std::runtime_error`类型的异常。`main()`函数中的`try`调用了该函数,而`catch`成功捕获了抛出的异常并进行了处理[^1]。 #### 5. 异常处理的注意事项 - **异常类型匹配**:`catch`按顺序检查异常类型,优先匹配写在前面的`catch`。如果多个`catch`可以捕获同一异常类型,则只有第一个匹配的`catch`会被执行[^3]。 - **资源管理**:在异常处理过程中,确保正确释放资源(如关闭文件、释放内存等),以避免潜在的资源泄漏问题。 - **性能影响**:频繁使用异常处理可能会对程序性能产生一定影响,因此应谨慎使用异常处理机制,仅在必要时才抛出异常[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值