【问题标题】:How to catch Exception Message in Erlang?如何在 Erlang 中捕获异常消息?
【发布时间】:2010-01-29 09:39:09
【问题描述】:

这是 Gen_server 未启动时抛出的异常消息。

(ankit@127.0.0.1)32> R11 = system_warning:self_test("SysWarn").
** exception exit: {noproc,
                    {gen_server,call,
                     [system_warning_sup,
                      {start_child,
                       {system_warning_SysWarn,
                        {system_warning,start_link,[{system_warning_SysWarn}]},
                        permanent,10,worker,
                        [system_warning]}},
                      infinity]}}
     in function  gen_server:call/3
     in call from system_warning_sup:'-start_child/1-lc$^0/1-0-'/1
     in call from system_warning:self_test/1
(ankit@127.0.0.1)33> R11.
* 1: variable 'R11' is unbound

现在,我要做的是捕获此异常消息并放入变量 R11(如上所示为未绑定)。我想这样做是因为如果 gen_sever 没有启动,那么我想在收到此消息后开始。我也尝试使用 handle_info 但无法捕获异常或可能无法正确实现它。任何机构都可以帮助我解决这个问题,例如提供一些代码。

【问题讨论】:

标签: exception exception-handling erlang


【解决方案1】:

@W55tKQbuRu28Q4xv 和@Zed 的答案都是正确的,但有点简洁。 :-)

有两种方法可以在本地捕获错误:catchtry。两者还将捕获由throw 生成的非本地返回。

catch 是两者中较旧且更简单的,具有catch Expr 的语法。如果正在评估的表达式中发生错误,则catch 返回{'EXIT',ErrorValue},否则它只返回表达式的值。它的一个问题是无法查看错误返回值是如何生成的,因此很容易在表达式中伪造它。以同样的方式,您无法查看返回值是否来自throw。注:这不是错误,而是一项功能。它也是一个优先级较低的前缀运算符,因此您通常会像这样使用它:

R11 = (catch system_warning:self_test (....))

为了避免混淆。这是一个错误,应该是catch ... end

throw 更复杂,允许您更好地控制要捕获的内容以及如何处理正常返回和错误/非本地返回。有关完整说明,请参阅手册。 @Zed 的示例展示了捕获所有内容的最简单情况。

【讨论】:

  • 感谢人澄清事情......这真的很有帮助。 :)
  • 一定是从 Java 中学来的,但我从不喜欢旧的 catch 语法......正是因为你提到的“功能”:)
【解决方案2】:
> try                                        
>   R11 = system_warning:self_test("SysWarn")
> catch                                      
>   Ex:Type -> {Ex,Type,erlang:get_stacktrace()}                       
> end.

【讨论】:

    【解决方案3】:

    尝试使用'catch': R11 = 捕捉 system_warning:self_test (....)

    【讨论】:

    • (zerg@casper)1> case catch drmaa:start () of (zerg@casper)1> E -> io:format ("~p~n", [E]) end。 {'EXIT',{undef,[{drmaa,start,[]}, {erl_eval,do_apply,5}, {erl_eval,expr,5}, {erl_eval,expr,5}, {shell,exprs,6}, {shell,eval_exprs,6}, {shell,eval_loop,3}]}} 好的 (zerg@casper)2>
    • 谢谢人...对不起...我不知道很多关于抓东西的事实,它也可以这样写,我试过了,但没有用。 :(
    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多