Я убежден в этом, что я должен создавать подклассы std::exception
для всех моих запросов на выброс исключений. Теперь я смотрю, как переопределить метод what
.
В ситуации, с которой я столкнулся, было бы очень удобно, если строка what
будет динамической. Некоторые части кода анализируют XML файл, например, и добавление номера или номера строки в сообщение об ошибке полезно для меня.
Я пытаюсь выполнить Рекомендации по обработке исключений Boost.
Что я хотел бы знать:
-
what
возвращает aconst char *
, что означает, что любой зрелище, скорее всего, не освободит строку. Поэтому мне нужно другое место для хранения результата, но где это будет? (Мне нужна безопасность потоков.) -
what
также включаетthrow()
в своей сигнатуре. Хотя я могу помешатьwhat
отбрасывать что-либо, мне кажется, что этот метод действительно не предназначен для чего-то слишком динамичного. Еслиwhat
- неправильное место, то где я должен это делать?
Из ответов, которые я получил до сих пор, похоже, что единственный способ добиться этого - сохранить строку в исключении. Рекомендации Boost рекомендуют против этого, что меня сбивает с толку, потому что std::runtime_error
делает именно это.
Даже если бы я использовал C-строку, мне пришлось бы использовать статический размер буфера или управлять памятью, что тоже может потерпеть неудачу. (Мне интересно, действительно ли это единственное, что может пойти не так, как в std::string
copy-constructor. Это означает, что я ничего не получу, используя динамически выделенные C-строки.)
Осталась ли еще одна опция?