Как использовать std::Exception — трассировка стека плюс утечка памяти ⇐ C++
-
Anonymous
Как использовать std::Exception — трассировка стека плюс утечка памяти
Я пытаюсь найти лучший способ борьбы с исключениями.
С++ говорит, что любой тип данных может быть выброшен как исключение, но невозможно определить, какой тип данных был выброшен, что делает исключения по существу бесполезными. Однако я предполагаю, что в наши дни все выбрасывают std::Exception, так что это безопасно. Это справедливое предположение?
(Я создаю библиотеку, которая будет использоваться другими, поэтому она должна сочетаться с другим кодом, который я не контролирую.)
Функция Exception.what возвращает символ * (а не строку) без возможности его освобождения. Конечно, эта строка должна содержать информацию об исключении, например, если файл не найден, то имя файла, который не был найден. Я предполагаю, что здесь мы просто терпим небольшую утечку памяти при возникновении исключений. Верно?
Неясно, насколько надежно можно генерировать трассировки стека в общем виде и отправлять их в файл журнала. (В производственной среде, когда что-то идет не так, а не в отладчике.) Поэтому я подумал о вставке избыточных блоков try/catch в интересных местах кода, которые могли бы добавить журналирование и добавить дополнительную информацию в текст What, а затем повторно выдать новое исключение. Но этот процесс, конечно, уничтожит любую трассировку стека. Например
foo = материал(); пытаться { процессСтафф () } catch (std::Exception& ex) { string msg = "При обработке " + foo.toString() + ": " + ex.what; журнал
Я пытаюсь найти лучший способ борьбы с исключениями.
С++ говорит, что любой тип данных может быть выброшен как исключение, но невозможно определить, какой тип данных был выброшен, что делает исключения по существу бесполезными. Однако я предполагаю, что в наши дни все выбрасывают std::Exception, так что это безопасно. Это справедливое предположение?
(Я создаю библиотеку, которая будет использоваться другими, поэтому она должна сочетаться с другим кодом, который я не контролирую.)
Функция Exception.what возвращает символ * (а не строку) без возможности его освобождения. Конечно, эта строка должна содержать информацию об исключении, например, если файл не найден, то имя файла, который не был найден. Я предполагаю, что здесь мы просто терпим небольшую утечку памяти при возникновении исключений. Верно?
Неясно, насколько надежно можно генерировать трассировки стека в общем виде и отправлять их в файл журнала. (В производственной среде, когда что-то идет не так, а не в отладчике.) Поэтому я подумал о вставке избыточных блоков try/catch в интересных местах кода, которые могли бы добавить журналирование и добавить дополнительную информацию в текст What, а затем повторно выдать новое исключение. Но этот процесс, конечно, уничтожит любую трассировку стека. Например
foo = материал(); пытаться { процессСтафф () } catch (std::Exception& ex) { string msg = "При обработке " + foo.toString() + ": " + ex.what; журнал
Мобильная версия