如何在 C++23 中抛出带有堆栈跟踪的异常?

问题描述 投票:0回答:2

C++23 可能会通过

<stacktrace>
标头引入堆栈跟踪机制。

我知道我们将会有一个由std::stack_trace

组成的
std::stacktrace_entry
班级,这一切都很好。但是 - 仅靠“现有”并没有多大帮助,因为每个人都必须煞费苦心地确保他们始终收集堆栈跟踪并将其放入他们抛出的异常中。那是……没有得到。
相反,我想要的是每个(?)异常自动携带堆栈跟踪,这样当我检查或打印它时,甚至当它在未捕获时自动打印时,堆栈跟踪都会被打印出来。 

这是计划中可能实现的,还是我要求太多?

c++ stack-trace c++23 boost-stacktrace
2个回答
8
投票

论文 2370:异常的堆栈跟踪 / Polukhin 和 Nekrashevich

这是几个月前(2021 年 8 月)提出的。它会让你写:

try { foo("test1"); bar("test2"); } catch (const std::exception& ex) { std::stacktrace trace = std::stacktrace::from_current_exception(); // <--- std::cerr << "Caught exception: " << ex.what() << ", trace:\n" << trace; }

但是有一个问题是是否默认打开此功能。可能有这样的东西:

std::this_thread::set_capture_stacktraces_at_throw(bool enable) noexcept;

您需要致电才能实现。

编辑:

不幸的是,这不会发生在 C++2023 中;可能在 2026 年。


0
投票

但是您可以创建一个自定义跟踪异常对象,在抛出时嵌入堆栈跟踪,并在整个代码中使用它。这可以使用

std::stacktrace

实现,或者您可以使用像

cpptrace
这样的库,它为 C++11 及更高版本实现跟踪异常。

© www.soinside.com 2019 - 2024. All rights reserved.