在我正在编写的C ++库中,我扩展了std :: runtime_error(只是具有唯一的类型-我不需要什么字符串)。但是我有时想在用户入口点捕获异常,以将附加上下文信息附加到what字符串,然后将其重新抛出。但是无论如何似乎都没有修改什么runtime_error字符串。为什么这样设计?是否要避免在重新分配内部字符串缓冲区的过程中可能发生内存不足的情况(这将导致新的异常)?还是他们只是想鼓励使用嵌套异常来做这种事情? (嵌套异常似乎不必要地麻烦,因为它们都在一个库的上下文中,但是也许我的想法是错误的。)我当前的方法是重写virtual 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_;
};
那么这种方法邪恶吗?有更好的方法吗?