【问题标题】:How can I write an exception stack trace in erlang after catching it?捕获后如何在erlang中编写异常堆栈跟踪?
【发布时间】:2010-11-23 01:46:14
【问题描述】:

假设我有这样的事情:

try code_that_fails()
catch _:_ -> .....

如何在 catch 块中打印堆栈跟踪?该块捕获所有异常,但我不知道如何打印堆栈...

你能帮帮我吗?

【问题讨论】:

  • Francesco,如果您对其中一个答案感到满意,请将其标记为正确/满意的答案

标签: exception erlang stack


【解决方案1】:

您的问题的答案是:

io:format("Backtrace ~p~n", [erlang:get_stacktrace()])

当前函数位于列表的开头。在man 3erl erlangerlang:get_stacktrace/0 中阅读更多内容

【讨论】:

    【解决方案2】:

    从 Erlang 21.0 开始,有一种获取堆栈跟踪的新官方方法。异常中第三个参数的try expression 中的可选模式匹配,其中将包含堆栈跟踪:

    try
       code_that_fails()
    catch
       _:_:Stacktrace ->
          erlang:display(Stacktrace)
    end
    

    旧版本(OTP 20 及以下)

    对于Erlang/OTP 20及以下的版本,需要使用get_stacktrace/0,可以获取调用过程中最后一个异常的stacktrace:

    try
       code_that_fails()
    catch
       _:_ ->
          erlang:display(erlang:get_stacktrace())
    end
    

    【讨论】:

    • 为了将来参考,从 Rejected Edit 添加 cmets:请注意,自 OTP 23 起,erlang:get_stack_trace() 返回一个空列表,已弃用。
    【解决方案3】:

    在您的示例中,您不需要 try;你可以这样做

    result = (catch code_that_fails()).
    

    如果引发异常,catch 返回一个包含 error code and stack trace 的元组。

    请注意,这通常被认为是不好的做法,因为它可以掩盖异常。另一个答案中描述的堆栈跟踪方法几乎肯定是您想要的。

    try 是原始catch 功能的扩展;如果使用它,则需要为要捕获的每种异常类型指定子句,并适当地处理它们。有关详细信息和清晰示例,请参阅Erlang reference manual 的第 6.18/6.19 节。

    【讨论】:

    • 只使用catch 通常被认为是错误的形式。如果您不知道要捕获 每个 异常,那么您可能不想要它。它会使一些错误更难找到。
    • @Adam Lindberg:谢谢 - 这可以解释反对意见。我将编辑我的答案。
    • 非常感谢大家!! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2023-03-22
    • 1970-01-01
    • 2010-12-20
    • 2012-03-02
    • 2011-11-13
    相关资源
    最近更新 更多