3

リストの各要素に対して次のループがあるとします。

lists:foldl(fun(X) -> ... end,N,Y),

エラーをキャッチして要素をループし続ける方法は?

このコードが gen_server にあり、 process_flag(trap_exit, true) の場合は同じ質問ですか?

4

2 に答える 2

3

このようにtry/catchを使用できないのはなぜですか?

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

または、エラー処理を抽出する場合は、次のようにデコレータ関数を使用できます。

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
于 2011-01-30T20:38:22.743 に答える
0

@hdimaによる最初の提案は最も簡単で、さまざまなエラー/スローなどを処理する方法を完全に制御できます。たとえば、foldlからの非ローカル出口の形式としてスローを許可したい場合があります。エラーを無視してもよろしいですか?

ただし、HandlerFactory は非常に複雑な OO 感があり、少しずれているように見えます。:-) また、オプションが大幅に制限されます。

このコードはgen_server、その効果が純粋にローカルであるため、 内で機能します。終了は他のプロセスからのシグナルであり、これらは によってキャッチされないため、終了のトラップはこれに影響を与えたり、影響を受けたりしませんtry。オンにtrap_exitすると、他のプロセスからのすべての終了シグナルが、receive他のメッセージとしてアクセスされるメッセージにローカルに変換されます。

于 2011-01-31T15:55:24.927 に答える