c++异常处理程序中嵌套的try..catch

Nested try...catch inside C++ exception handler?

本文关键字:try catch 嵌套 异常处理程序 c++      更新时间:2023-10-16

我想在异常处理程序中执行的代码本身可能会抛出异常。

下面的结构是合法的c++吗?如果有,有什么缺点吗?

try
{
    // ...
}
catch (const E&)
{
    try
    {
        // ...
    }
    catch (const F&)
    {
    }
}

实际上,甚至有一种使用嵌套try/catch块的有趣技术:假设您有多个函数需要有效地进行相同的异常处理。特别是在包装另一个接口时,这是常见的情况。在这种情况下,可以捕获所有异常,从异常处理程序调用函数,并在该函数中重新抛出异常以实现实际的异常处理:

void fancy_handler() {
    try {
        throw; // assumes that fancy_handler() is called from catch-clause
    } catch (std::runtime_error const& rt) {
        std::cout << "runtime-error: " << ex.what() << "n";
    } catch (std::exception const& ex) {
        std::cout << "excption: " << ex.what() << "n";
    } catch (...) {
        std::cout << "unknown exceptionn";
    }
}
void foo() { try { do_foo(); } catch (...) { fancy_handler(); } }
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } }

我就是喜欢避免重复的[重要的]代码!

不,没有缺点。你应该这样做