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

Exception 如何在Erlang中捕获异常消息?,exception,exception-handling,erlang,Exception,Exception Handling,Erlang,这是Gen_服务器未启动时引发的异常消息 (ankit@127.0.0.1)32> R11 = system_warning:self_test("SysWarn"). ** exception exit: {noproc, {gen_server,call, [system_warning_sup, {start_child,

这是Gen_服务器未启动时引发的异常消息

(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(上面显示为unbound)。我想这样做是因为如果gen_服务器没有启动,那么我想在收到此消息后启动。我还尝试使用handle_info,但无法捕获异常,或者可能无法正确实现异常。任何人都可以帮我解决这个问题,比如提供一些代码

尝试使用“catch”:
R11=捕捉系统警告:自检(..)

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

本地捕获错误有两种方法:
catch
try
。两者都将捕获由
throw
生成的非本地返回

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

R11 = (catch system_warning:self_test (....))
以避免混淆。这是一个错误,应该是
catch。。。结束


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

(zerg@casper)1> 案例捕获drmaa:的开始()(zerg@casper)1> E->io:format(“~p~n,[E])结束。{'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> 谢谢你,伙计。。。对不起。。。我不知道有多少关于catch thing的事实,它也可以这样写,我尝试了&但没有成功(感谢man澄清了一些事情……这真的很有帮助。:)这一定是从Java学来的,但我从来不喜欢旧的catch语法。。。正是因为你提到的“功能:)找到了一个与我的问题相关的问题。
R11 = (catch system_warning:self_test (....))