深入理解C++异常处理机制:语法、示例与栈解旋

在C++11及以后的版本中,throw() 特定的异常列表(也称为异常规范)已经被废弃,因为在实际使用中,它们并没有提供太多有用的功能,而且经常导致代码难以维护。因此,在现代C++编程中,我们通常不再使用throw()来指定函数可能抛出的异常类型。

图片[1]_深入理解C++异常处理机制:语法、示例与栈解旋_知途无界

此外,main函数中的注释提到“抛出异常后析构创建的异常对象”,但实际上,这个析构是在catch块执行完毕后发生的,而不是在catch块之前。当异常被抛出时,会立即开始栈的解旋过程,这包括调用在try块中创建的所有局部对象的析构函数(按照它们创建的反向顺序),但不会调用在catch块中创建的对象的析构函数(除非catch块再次抛出异常)。

下面是更新后的main函数,其中我添加了一些注释来澄清栈解旋和异常对象析构的过程:

int main() {
cout << "In main function" << endl;
try {
func(); // 这里调用func()函数,可能会抛出MyException异常
// 如果func()抛出异常,则程序流程会立即跳转到匹配的catch块
// 抛出异常后,func()中创建的Demo对象d会被析构(栈解旋)
// 然后执行匹配的catch块
// 如果没有异常抛出,则继续执行下面的func()调用(但在这个示例中,下面的func()调用永远不会执行)
// func(); // 这行代码在func()抛出异常后不会被执行
}
// catch块捕获到异常后,会执行catch块中的代码
// 在catch块中,可以通过引用访问抛出的异常对象
// 当catch块执行完毕后,异常对象(MyException实例)会被析构
catch (MyException& e) {
cout << "Caught an exception:" << e.getMessage() << endl;
}
// 这里,无论是否捕获到异常,都会继续执行main函数剩余的部分
cout << "Resume execution after exception handling." << endl;
return 0;
}
int main() {  
    cout << "In main function" << endl;  
    try {  
        func(); // 这里调用func()函数,可能会抛出MyException异常  
        // 如果func()抛出异常,则程序流程会立即跳转到匹配的catch块  
        // 抛出异常后,func()中创建的Demo对象d会被析构(栈解旋)  
        // 然后执行匹配的catch块  
        // 如果没有异常抛出,则继续执行下面的func()调用(但在这个示例中,下面的func()调用永远不会执行)  
        // func(); // 这行代码在func()抛出异常后不会被执行  
    }  
    // catch块捕获到异常后,会执行catch块中的代码  
    // 在catch块中,可以通过引用访问抛出的异常对象  
    // 当catch块执行完毕后,异常对象(MyException实例)会被析构  
    catch (MyException& e) {  
        cout << "Caught an exception:" << e.getMessage() << endl;  
    }  
    // 这里,无论是否捕获到异常,都会继续执行main函数剩余的部分  
    cout << "Resume execution after exception handling." << endl;  
    return 0;  
}
int main() { cout << "In main function" << endl; try { func(); // 这里调用func()函数,可能会抛出MyException异常 // 如果func()抛出异常,则程序流程会立即跳转到匹配的catch块 // 抛出异常后,func()中创建的Demo对象d会被析构(栈解旋) // 然后执行匹配的catch块 // 如果没有异常抛出,则继续执行下面的func()调用(但在这个示例中,下面的func()调用永远不会执行) // func(); // 这行代码在func()抛出异常后不会被执行 } // catch块捕获到异常后,会执行catch块中的代码 // 在catch块中,可以通过引用访问抛出的异常对象 // 当catch块执行完毕后,异常对象(MyException实例)会被析构 catch (MyException& e) { cout << "Caught an exception:" << e.getMessage() << endl; } // 这里,无论是否捕获到异常,都会继续执行main函数剩余的部分 cout << "Resume execution after exception handling." << endl; return 0; }

在这个修改后的main函数中,我添加了一条注释来强调即使发生异常,main函数剩余的部分仍然会继续执行(除非在catch块中再次抛出异常或调用std::terminate等函数)。此外,我还添加了一条注释来指出异常对象是在catch块执行完毕后被析构的。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞5 分享
Put blinders on to those things that conspire to hold you back, especially the ones in your own head.
不要去想那些阻碍你的事,尤其是那些自己想象出来的事
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容