Как использовать std::Exception — трассировка стека плюс утечка памятиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать std::Exception — трассировка стека плюс утечка памяти

Сообщение Anonymous »


Я пытаюсь найти лучший способ борьбы с исключениями.

С++ говорит, что любой тип данных может быть выброшен как исключение, но невозможно определить, какой тип данных был выброшен, что делает исключения по существу бесполезными. Однако я предполагаю, что в наши дни все выбрасывают std::Exception, так что это безопасно. Это справедливое предположение?

(Я создаю библиотеку, которая будет использоваться другими, поэтому она должна сочетаться с другим кодом, который я не контролирую.)

Функция Exception.what возвращает символ * (а не строку) без возможности его освобождения. Конечно, эта строка должна содержать информацию об исключении, например, если файл не найден, то имя файла, который не был найден. Я предполагаю, что здесь мы просто терпим небольшую утечку памяти при возникновении исключений. Верно?

Неясно, насколько надежно можно генерировать трассировки стека в общем виде и отправлять их в файл журнала. (В производственной среде, когда что-то идет не так, а не в отладчике.) Поэтому я подумал о вставке избыточных блоков try/catch в интересных местах кода, которые могли бы добавить журналирование и добавить дополнительную информацию в текст What, а затем повторно выдать новое исключение. Но этот процесс, конечно, уничтожит любую трассировку стека. Например

foo = материал(); пытаться { процессСтафф () } catch (std::Exception& ex) { string msg = "При обработке " + foo.toString() + ": " + ex.what; журнал
Ответить

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

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

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

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

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