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
в моем примере)?
Это не совсем во время разматывания стека. Как только блок захвата введен, стек уже разматывается.
И да, этот код является законным. Смотрите этот вопрос: Вложенный try … catch внутри обработчика исключений C ++?
Ответ Пабби лучше всего соответствует сценарию, который вы описываете.
В качестве дополнения, пока стек раскручивается, единственный исполняемый код пользователя — это деструкторы (и код, вызываемый этими деструкторами).
если ты делать throw
в деструкторе в этом сценарии стандарт указывает, что std::terminate()
будет называться.