Итак, для регистрации стека вызовов мне нужно сделайте это, прежде чем разматывать стопку. Это можно сделать с помощью конструктора исключений или обработчика завершения. Последний подход позволяет протоколировать стек вызовов, но приведет к завершению программы, что может быть нежелательно. Вот пример: приложение с графическим интерфейсом, которое не аварийно завершает работу, но регистрирует/отображает трассировку стека и позволяет пользователю выполнить другую операцию. Но отсутствие сбоя означает перехват исключений, а это означает раскручивание стека...
Есть ли какой-нибудь хороший способ объединить обработку исключений с кодом, который может выполняться как обработчик завершения (сразу после создания исключения)? Например, если обработчик завершения не был объявлен [[noreturn]] noException, я мог бы зарегистрировать стек вызовов, а затем подставить тип исключения, сделав его восстанавливаемым:
Код: Выделить всё
/*[[no-noreturn]]*/ void onTerminate() /*no-noexcept*/ {
std::string stackDescription = ...
throw MyExceptionToBeCaughtInGUI(std::move(stackDescription));
}
int main() {
std::set_terminate(&onTerminate);
try {
// run...
}
catch(const MyExceptionToBeCaughtInGUI &e) {
displayCallStack(e.stackDescription);
}
}
Обновление: ответ на этот вопрос не дает решения для моего случая. Я знаю, как регистрировать стек, когда завершаю программу, но основная часть моего вопроса заключается в том, как это сделать без завершения. Пожалуйста, удалите дубликаты.
Подробнее здесь: https://stackoverflow.com/questions/786 ... on-handler