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
作为任何其他消息进行访问