是否保证未捕获的异常消息

发布于 2025-01-10 23:38:52 字数 415 浏览 0 评论 0原文

以下代码是否

#include <stdexcept>

int main() {
    throw std::runtime_error("foobar");
}

保证产生以下输出?

terminate called after throwing an instance of 'std::runtime_error'
  what():  foobar
fish: Job 1, './a.out' terminated by signal SIGABRT (Abort)

我可以在每个编译器上依赖这个精确的输出吗? 我可以依赖将调用 what 方法并打印错误消息吗?

Is the following code

#include <stdexcept>

int main() {
    throw std::runtime_error("foobar");
}

guaranteed to produce the following outout?

terminate called after throwing an instance of 'std::runtime_error'
  what():  foobar
fish: Job 1, './a.out' terminated by signal SIGABRT (Abort)

Can I rely on this exact output on every compiler?
Can I rely on that what method will be called and error message will be printed will be printed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

木緿 2025-01-17 23:38:52

不,不保证,未指定是否有任何消息。来自 cppreference

如果抛出异常但未捕获,包括转义 std::thread 的初始函数、主函数以及任何静态或线程本地对象的构造函数或析构函数的异常,然后调用 std::terminate 。对于未捕获的异常是否发生任何堆栈展开是由实现定义的。

这里相关的情况是“逃逸[...]主函数的异常”。不过,对 std::terminate 的调用是有保证的。您可以安装 std::terminate_handler如果您愿意,可以打印自定义消息。

No it is not guaranteed, it unspecified whether there is any message. From cppreference:

If an exception is thrown and not caught, including exceptions that escape the initial function of std::thread, the main function, and the constructor or destructor of any static or thread-local objects, then std::terminate is called. It is implementation-defined whether any stack unwinding takes place for uncaught exceptions.

The case that is relevant here is "exceptions that escape [...] the main function". The call to std::terminate is guaranteed though. And you can install a std::terminate_handler to print a custom message if you like.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文