嵌套try ...捕获C ++异常处理程序?

时间:2012-01-03 11:33:43

标签: c++ exception try-catch

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

以下结构是否合法C ++?如果是,是否有任何缺点?

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

    }
}

3 个答案:

答案 0 :(得分:22)

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

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 exception\n";
    }
}

void foo() { try { do_foo(); } catch (...) { fancy_handler(); } }
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } }

我只是喜欢避免重复的[非平凡]代码!

答案 1 :(得分:18)

不,没有缺点。这就是你应该这样做的方式。

答案 2 :(得分:4)

这是一种非常有效的编码方式。

#include <iostream>
using namespace std;



int main(int argc, char* argv[])
{
        try       //outer try{}
        {
                try   //inner try{}
                {
                    throw std::runtime_error("Demo");
                }
                catch (std::runtime_error& e)
                {
                    std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
                    throw;
                }
        }
        catch (std::exception& e)
        {
            std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
        }

    return 0;
}