Безопасно ли бросать / ловить в стеке?

Q: Безопасно ли бросать и перехватывать исключение при размотке стека, или приложение вызывает terminate на второй бросок?

минимальный пример:

void some_function()
{
try
{
// do stuff here that can throw
throw std::runtime_error("blah");
} catch(const std::exception& re)
{
try // this code could be in some function called from here
{
// do something with re here that throws a logical_error
throw std::logical_error("blah blah"); // does this call terminate?
} catch(const std::logical_error& le)
{
}
}
}

Мне стало любопытно после прочтения этот вопрос.

Примечание: я знаю, что вы можете / должны catch(...) в деструкторе, но имеет ли смысл вообще иметь try/catch в catch блок — возможно, в какой-то функции вызывается исключение (re в моем примере)?

1

Решение

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

И да, этот код является законным. Смотрите этот вопрос: Вложенный try … catch внутри обработчика исключений C ++?

4

Другие решения

Ответ Пабби лучше всего соответствует сценарию, который вы описываете.

В качестве дополнения, пока стек раскручивается, единственный исполняемый код пользователя — это деструкторы (и код, вызываемый этими деструкторами).

если ты делать throw в деструкторе в этом сценарии стандарт указывает, что std::terminate() будет называться.

2

По вопросам рекламы [email protected]