【发布时间】:2010-04-10 16:43:39
【问题描述】:
此时我确信我应该为我所有的异常抛出需求创建std::exception 的子类。现在我正在研究如何覆盖what 方法。
我所面临的情况,如果字符串what 返回是动态的,那将非常方便。例如,有些代码会解析 XML 文件,在错误消息中添加位置或行号对我很有用。
我正在尝试关注Boost Exception handling guidelines。
我想知道的:
what返回一个const char *,这意味着任何捕手都可能不会释放字符串。所以我需要其他地方来存储结果,但那会在哪里呢? (我需要线程安全。)what还在其签名中包含throw()。虽然我可以阻止我的what抛出任何东西,但在我看来,这种方法确实不适合任何过于动态的东西。如果what不是正确的地方,那我应该在哪里做呢?
从我目前得到的答案看来,实现这一点的唯一方法是将字符串存储在异常中。 Boost 指南建议不要这样做,这让我很困惑,因为 std::runtime_error 就是这样做的。
即使我要使用 C 字符串,我也必须使用静态大小的缓冲区,或者进行内存管理,这也可能会失败。 (我想知道这是否真的是std::string 的复制构造函数中唯一可能出错的地方。这意味着我不会使用动态分配的 C 字符串获得任何东西。)
还有其他选择吗?
【问题讨论】:
-
添加了 Boost 指南点,如果不适合您,请重新编辑。