gpt4 book ai didi

c++ - 从 std::exception 的 `what` 返回一个动态字符串

转载 作者:IT老高 更新时间:2023-10-28 22:02:30 26 4
gpt4 key购买 nike

此时我确信我应该为我所有的异常抛出需求创建 std::exception 的子类。现在我正在研究如何覆盖 what 方法。

我所面临的情况,如果字符串 what 返回是动态的,那将非常方便。例如,有些代码会解析 XML 文件,在错误消息中添加位置或行号对我很有用。

我正在尝试关注 Boost Exception handling guidelines .

我想知道的:

  • what 返回一个 const char *,这意味着任何捕手都可能不会释放字符串。所以我需要其他地方来存储结果,但那会在哪里呢? (我需要线程安全。)

  • what 在其签名中也包含 throw()。虽然我可以防止我的 what 抛出任何东西,但在我看来,这种方法确实不适合任何过于动态的东西。如果 what 不是正确的地方,那我应该在哪里做呢?


从我目前得到的答案看来,实现这一点的唯一方法是将字符串存储在异常中。 Boost 指南建议不要这样做,这让我很困惑,因为 std::runtime_error 就是这样做的。

即使我要使用 C 字符串,我也必须使用静态大小的缓冲区,或者进行内存管理,这也可能会失败。 (我想知道这是否真的是 std::string 的复制构造函数中唯一可能出错的地方。这意味着我不会使用动态分配的 C 字符串获得任何东西。 )

还有其他选择吗?

最佳答案

我的异常类通常除了构造函数之外什么都没有,请按照以下思路查看:

class MyEx: public std::runtime_error 
{
public:
MyEx(const std::string& msg, int line):
std::runtime_error(msg + " on line " + boost::lexical_cast<string>(line))
{}
};

一个任意示例,但它是处理管理 what() 消息的基类。

但是如果你愿意,你也可以只分配异常对象的基础部分,在你将消息放在构造函数体中之后。

#include <stdexcept>
#include <string>
#include <sstream>

class MyEx: public std::runtime_error
{
public:
MyEx(const std::string& msg, int line):
std::runtime_error("")
{
std::stringstream ss;
ss << msg << " on line " << line;
static_cast<std::runtime_error&>(*this) = std::runtime_error(ss.str());
}
};

#include <iostream>
int main()
{
try {
throw MyEx("Evil code", __LINE__);
}
catch (const std::exception& e) {
std::cout << e.what() << '\n';
}
}

但是,关于 boost 的指导方针,也许您应该注意一点,数字数据(位置和线)可能最好通过其他方法以数字形式提供。指南说不要担心 what() 消息。

关于c++ - 从 std::exception 的 `what` 返回一个动态字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2614113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com