6

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

我知道我们要上一std::stack_trace堂课,由他们组成std::stacktrace_entry,这一切都很好。但是 - 仅仅存在这不会有太大帮助,因为每个人都必须煞费苦心地确保他们总是收集堆栈跟踪并将其放入他们抛出的异常中。那就是……没有。

相反,我想要的是让每个 (?) 异常自动携带一个堆栈跟踪,这样当我检查或打印它时,或者即使它在没有被捕获时自动打印,堆栈跟踪也会被打印出来。

这是否计划成为可能,还是我要求太多?

4

1 回答 1

5

不是一个明确的答案,但有一个建议基本上允许你想要什么:

论文 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 年。

于 2021-12-29T19:17:14.137 回答