如何在Erlang中捕获异常消息?

时间:2010-01-29 09:39:09

标签: exception exception-handling erlang

这是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但不能捕获异常或者可能无法正确实现它。任何人都可以帮我解决这个问题,例如提供一些代码。

3 个答案:

答案 0 :(得分:6)

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

本地捕获错误的方法有两种:catchtry。两者都将捕获throw生成的非本地回报。

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

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

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

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

答案 1 :(得分:5)

> try                                        
>   R11 = system_warning:self_test("SysWarn")
> catch                                      
>   Ex:Type -> {Ex,Type,erlang:get_stacktrace()}                       
> end.

答案 2 :(得分:0)

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