В библиотеке C ++, которую я пишу, я расширил std :: runtime_error (просто для того, чтобы иметь уникальный тип - мне ничего не нужно, кроме what-string).Но иногда я хочу перехватить исключение в точке входа пользователя, чтобы добавить дополнительную контекстную информацию к строке what, а затем перебросить ее.Но, похоже, в любом случае нет возможности изменить строку what из runtime_error.Почему так устроено?Чтобы избежать возможного состояния нехватки памяти во время перераспределения внутреннего строкового буфера (что приведет к новому исключению)?Или они просто хотят поощрять использование вложенных исключений для подобных вещей?(Вложенные исключения кажутся излишне громоздкими, поскольку все они находятся в контексте одной библиотеки, но, возможно, я ошибаюсь.) Мой текущий подход заключается в переопределении виртуального метода what и возвращении моей собственной (добавляемой) строки:
#include <stdexcept>
#include <string>
class MyException : public std::runtime_error
{
public:
explicit MyException(const std::string& what_arg) :
MyException(what_arg.data())
{
}
explicit MyException(const char* what_arg) :
runtime_error(""),
what_("MyException: ")
{
append(what_arg);
}
const char* what() const noexcept
{
return what_.data();
}
void append(const char* msg)
{
what_.append(msg);
}
void append(const std::string& msg)
{
what_.append(msg);
}
private:
// As near as I can tell, there is no way to modify the what arg
// of runtime_error, so I don't use it and make make my own what
// arg here.
//
std::string what_;
};
Так этот подход злой?Есть ли лучший способ?