Вложенный try ... catch внутри обработчика исключений C ++? - PullRequest
15 голосов
/ 03 января 2012

Код, который я хочу выполнить в моем обработчике исключений, может сам вызвать исключение.

Является ли следующая структура допустимой в C ++?Если да, есть ли минусы?

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

    }
}

Ответы [ 3 ]

22 голосов
/ 04 января 2012

На самом деле, есть даже интересная техника для использования вложенных блоков 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 exception\n";
    }
}

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

Мне просто нравится избегать дублирования [нетривиальный] код!

18 голосов
/ 03 января 2012

Нет, минусов нет. Вот как ты должен это делать.

4 голосов
/ 03 января 2012

Это совершенно правильный способ кодирования.

#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;
}
...