【发布时间】:2020-09-08 14:22:03
【问题描述】:
我试图提出自定义 std::exception 类,但我对如何正确实现 what() 感到困惑。
例如,让我们有
class int_error : std::exception
{
int param;
public:
int_error(int param)
: param(param)
{
}
char const* what() const override
{
// return "Error occurred while processing number " + param
// How to return this?
}
};
我不能使用std::string("text").c_str()(在函数返回之前被销毁)和任何与手动管理生命周期相关的东西(比如new char[])都不起作用(会泄漏内存),因为我永远不能删除它(因为我什至不能将指针存储在任何地方,因为what 是const)。
我知道我可以提前准备错误字符串(构造函数),然后在what 中返回它。
如果what 改为返回std::string,我就不会遇到这个困难。这是对 STL 的疏忽还是我遗漏了什么(我可能是)。
【问题讨论】:
-
因为构造和复制
std::string也会抛出异常。在堆栈展开期间复制异常时抛出第二个异常会导致各种问题。