Подтвердить что ты не робот

Вложенная попытка... уловить внутри обработчика исключений С++?

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

Является ли следующая структура законченной С++? Если да, есть ли недостатки?

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

    }
}
4b9b3361

Ответ 1

Нет, нет недостатков. То, как вы должны это делать.

Ответ 2

На самом деле существует даже интересная техника для использования вложенных 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(); } }

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

Ответ 3

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

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