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

最佳答案

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

有两种方法可以本地捕获错误:catchtry。两者也将捕获由throw生成的非本地收益。

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

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


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

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

关于exception - 如何在Erlang中捕获异常消息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2161026/

10-17 01:24