gpt4 book ai didi

c++ - 使用预处理器宏构建用于抛出 std::exception 的信息消息的简单方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:09 25 4
gpt4 key购买 nike

在我的代码的某些点,我想抛出一个异常并向它提供一些关于我抛出它的代码的信息。有点像

void Foo() {
if(condition)
throw std::logic_error(ERROR_MSG);
}

// somewhere later in code
try {
Foo()
} catch (std::exception & e) {
e.what();
}

现在的问题是——我该如何构造这个错误信息?我想提供有关文件、代码行、函数名称和一些自己的信息的信息。有些东西(我怀疑)应该是非常标准的用法——但经过广泛搜索后,我仍然没有找到关于这个(我认为)简单主题有用的东西。

我只想写这样的东西

throw std::logic_arrow("Whoops! Error in (" +
__func__ + ") " + __FILE__ + ":" + __LINE__);

但是由于各种原因,这似乎行不通。以下是我目前的搜索结果:

  • 已经有一个类似的问题here ,但这是关于是否应该使用这些宏,而不是如何
  • This问题涉及在宏中连接 __FILE____LINE__,所以我的回答有点远
  • __func__ 宏似乎造成了困难,因为“这些标识符是变量,而不是预处理器宏,不能用于初始化 char 数组或与字符串文字连接”在 gcc homepage 之后.好吧,它现在是一个变量,我可以在 printf 函数中使用,例如 here – 但我没能掌握转移到我自己的问题
  • 一个人担心有一个比宏更干净的解决方案,使用 inline functions , 所以我什至可以改进解决方案
  • 另一个 thread 中建议的 C++14 技术, 使用 operator ""s

最佳答案

只需这样做:

throw std::logic_error(std::string{} + "Whoops! Error in (" +
__func__ + ") " + __FILE__ + ":" + std::to_string(__LINE__));

live example

有时您可以像 IDE 处理自己的错误消息一样对其进行格式化,然后获得双击支持。

throw std::logic_error(std::string{} + __FILE__ + "(" + std::to_string(__LINE__) + "): [" + __func__ +"] " + "Whoops! Error!  Whodathunk.");

或类似的东西。

template<class E>
[[noreturn]] void fancy_throw( std::string msg,
char const* file, char const* function,
std::size_t line
) {
throw E( std::string{} + file + "(" + std::to_string(line) + "): [" +
function + "] " + msg );
}
#define EXCEPTION( TYPE, MESSAGE ) \
fancy_throw<TYPE>( MESSAGE, __FILE__, __func__, __LINE__ )

我们得到:

EXCEPTION( std::logic_error, "Whoops! Error!  Whodathunk." );

live example

我觉得这很糟糕。相反,我们可以使用 SOURCE_ERROR 宏:

inline std::string make_source_error( std::string msg,
char const* file, char const* function,
std::size_t line
) {
return std::string{} + file + "(" + std::to_string(line) + "): [" +
function + "] " + msg;
}
#define SOURCE_ERROR(...) make_source_error(__VA_ARGS__, __FILE__, __func__, __LINE__ )

将流控制放在宏之外,但在宏内使用标记构建字符串,并在普通函数内构建字符串。

只有必须在宏中完成的事情(或在我们使用它的任何地方复制/粘贴)才在此处的宏中完成。这是应该的。

live example

...__VA_ARGS__ 在那里是因为宏语言不理解 C++ 中 , 的某些用法。

关于c++ - 使用预处理器宏构建用于抛出 std::exception 的信息消息的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37181621/

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