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

ein*_*ica 7 c++ stack-trace c++23

C++23 可能会通过标头引入堆栈跟踪机制<stacktrace>

我知道我们将会有一个由“ies”std::stack_trace组成的班级std::stacktrace_entry,这一切都很好。但是 - 仅现有的这不会有太大帮助,因为每个人都必须煞费苦心地确保他们始终收集堆栈跟踪并将其放入他们抛出的异常中。这是不好的。

相反,我想要的是每个(?)异常自动携带堆栈跟踪,这样当我检查它或打印它时,甚至当它在未捕获时自动打印时,堆栈跟踪都会被打印出来。

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

ein*_*ica 7

这不是一个明确的答案,但有一个提案P2370:来自 Exception / Polukhin & Nekrashevich 的堆栈跟踪,基本上允许您想要的东西。这是在 2021 年 8 月提出的,并没有进入 C++23,但可能会进入 C++26(有关状态,请参阅 GitHub)。

它会让你写:

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;
}
Run Code Online (Sandbox Code Playgroud)

存在是否默认打开此功能的问题。可能有这样的事情:

std::this_thread::set_capture_stacktraces_at_throw(bool enable) noexcept;
Run Code Online (Sandbox Code Playgroud)

您需要致电才能实现这一目标。