Erlang 循环中的错误
给定列表中每个元素的以下循环:Erlang 循环中的错误,erlang,erlang-driver,Erlang,Erlang Driver,给定列表中每个元素的以下循环: lists:foldl(fun(X) -> ... end,N,Y), 如何捕捉错误并继续在元素上循环 同样的问题,如果此代码位于gen_服务器中,并且如果进程标记(trap_exit,true)?为什么不能这样使用 1> lists:foldl( 1> fun (E, A) -> 1> try E + A 1> catch 1> _:_ -> 1&g
lists:foldl(fun(X) -> ... end,N,Y),
如何捕捉错误并继续在元素上循环
同样的问题,如果此代码位于gen_服务器中,并且如果进程标记(trap_exit,true)?为什么不能这样使用
1> lists:foldl(
1> fun (E, A) ->
1> try E + A
1> catch
1> _:_ ->
1> A
1> end
1> end, 0, [1, 2, 3, 4, a, 6]).
16
如果要提取错误处理,也可以使用decorator函数,如下所示:
1> Sum = fun (E, A) -> E + A end.
#Fun<erl_eval.12.113037538>
2> HandlerFactory = fun (F) ->
2> fun (E, A) ->
2> try F(E, A)
2> catch
2> _:_ ->
2> A
2> end
2> end
2> end.
#Fun<erl_eval.6.13229925>
3> lists:foldl(HandlerFactory(Sum), 0, [1, 2, 3, 4, a, 6]).
16
4> Mul = fun (E, A) -> E * A end.
#Fun<erl_eval.12.113037538>
5> lists:foldl(HandlerFactory(Mul), 1, [1, 2, 3, 4, a, 6]).
144
1>Sum=fun(E,A)->E+A结束。
#乐趣
2> HandlerFactory=乐趣(F)->
2> 乐趣(E,A)->
2> 试试F(E,A)
2> 抓住
2> _:_ ->
2> A
2> 结束
2> 结束
2> 结束。
#乐趣
3> 列表:foldl(HandlerFactory(Sum),0,[1,2,3,4,a,6])。
16
4> Mul=乐趣(E,A)->E*结束。
#乐趣
5> 列表:foldl(HandlerFactory(Mul),1、[1,2,3,4,a,6])。
144
由@hdima提出的第一个建议是最简单的,它使您能够完全控制如何处理不同的错误/抛出等。例如,您可能希望允许抛出作为foldl的非本地退出形式。您真的确定要忽略错误吗
HandlerFactory对此有一种过于复杂的OO感觉,似乎有点不对劲。:-)这也严重限制了你的选择
此代码将在gen_服务器
中工作,因为其效果纯粹是本地的。捕获出口不会影响这一点,也不会受其影响,因为出口是来自其他进程的信号,这些信号不会被try
捕获。打开trap\u exit
会导致来自其他进程的所有退出信号被本地转换为消息,这些消息可以使用receive
作为任何其他消息进行访问