Как объединить обработку исключений с обработчиком завершения? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как объединить обработку исключений с обработчиком завершения? [дубликат]

Сообщение Anonymous »

Проблема высокого уровня, которую я пытаюсь решить, заключается в регистрации трассировки стека для каждого исключения, возникающего из [устаревшего] кода. Решение, которому я пытаюсь найти альтернативу, - это регистрация трассировки стека из конструктора исключений. Действительно, это работает только для пользовательских типов исключений, и для этого требуется обернуть все остальные примитивы только с целью замены стандартных исключений пользовательскими.
Итак, для регистрации стека вызовов мне нужно сделайте это, прежде чем разматывать стопку. Это можно сделать с помощью конструктора исключений или обработчика завершения. Последний подход позволяет протоколировать стек вызовов, но приведет к завершению программы, что может быть нежелательно. Вот пример: приложение с графическим интерфейсом, которое не аварийно завершает работу, но регистрирует/отображает трассировку стека и позволяет пользователю выполнить другую операцию. Но отсутствие сбоя означает перехват исключений, а это означает раскручивание стека...
Есть ли какой-нибудь хороший способ объединить обработку исключений с кодом, который может выполняться как обработчик завершения (сразу после создания исключения)? Например, если обработчик завершения не был объявлен [[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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как интегрировать пользовательскую обработку исключений с обработкой исключений FASTAPI?
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Упорная повторная попытка с обработчиком исключений
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Надежная функция с глобальным обработчиком исключений
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Надежная функция с глобальным обработчиком исключений
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Надежная функция с глобальным обработчиком исключений
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»