Как использовать 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; журнал

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