这是Gen_server未启动时抛出的异常消息。
([email protected])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
([email protected])33> R11.
* 1: variable 'R11' is unbound
现在,我要做的是捕获此异常消息并放入变量R11(上面显示为未绑定)。我想这样做是因为如果gen_sever没有启动,那么我想在收到此消息后启动。我也尝试使用handle_info,但无法捕获异常或可能无法正确实现它。任何机构都可以例如通过提供一些代码来帮助我解决这个问题。
最佳答案
@ W55tKQbuRu28Q4xv和@Zed的答案都是正确的,但有点简洁。 :-)
有两种方法可以本地捕获错误:catch
和try
。两者也将捕获由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/