【问题标题】:How will I throw exceptions with stack traces in C++23?如何在 C++23 中使用堆栈跟踪引发异常?
【发布时间】:2021-12-29 19:17:14
【问题描述】:

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

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

相反,我希望每个 (?) 异常自动携带堆栈跟踪,这样当我检查或打印它时,甚至当它没有被捕获时自动打印时,堆栈跟踪都会被打印出来出去。

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

【问题讨论】:

    标签: c++ stack-trace c++23 boost-stacktrace


    【解决方案1】:

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

    Paper 2370: Stack Trace from Exception / 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 年。

    【讨论】:

    • @Barry: 哇,伙计:-(
    • 还有另一个修改建议,您不必激活堆栈跟踪,但在捕获异常时标记堆栈跟踪的集合。另一个优点是它没有堆栈跟踪的开销(直到收集)。但也标记为 C++26(可能)。
    • 直到现在,我还认为 C++ 是一种带有一些包袱的古老语言。其他语言将从经验中学习。但对于委员会来说,情况可能恰恰相反,C++ 会在 10 到 20 年后引入特性,并希望一切都正确。
    • @Sebastian:嗯,对于图书馆功能,它更像是:你可以在几年甚至几十年内获得它们,然后在某个时候它们会到达委员会。那你再等一会。然后最终当你老了,他们会进入语言并做你想让他们做的事情:-)
    猜你喜欢
    • 2017-08-06
    • 2011-01-05
    • 2022-08-24
    • 2011-06-01
    • 1970-01-01
    • 2010-09-13
    • 2010-10-16
    相关资源
    最近更新 更多