リストの各要素に対して次のループがあるとします。
lists:foldl(fun(X) -> ... end,N,Y),
エラーをキャッチして要素をループし続ける方法は?
このコードが gen_server にあり、 process_flag(trap_exit, true) の場合は同じ質問ですか?
リストの各要素に対して次のループがあるとします。
lists:foldl(fun(X) -> ... end,N,Y),
エラーをキャッチして要素をループし続ける方法は?
このコードが gen_server にあり、 process_flag(trap_exit, true) の場合は同じ質問ですか?
このように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
@hdimaによる最初の提案は最も簡単で、さまざまなエラー/スローなどを処理する方法を完全に制御できます。たとえば、foldlからの非ローカル出口の形式としてスローを許可したい場合があります。エラーを無視してもよろしいですか?
ただし、HandlerFactory は非常に複雑な OO 感があり、少しずれているように見えます。:-) また、オプションが大幅に制限されます。
このコードはgen_server
、その効果が純粋にローカルであるため、 内で機能します。終了は他のプロセスからのシグナルであり、これらは によってキャッチされないため、終了のトラップはこれに影響を与えたり、影響を受けたりしませんtry
。オンにtrap_exit
すると、他のプロセスからのすべての終了シグナルが、receive
他のメッセージとしてアクセスされるメッセージにローカルに変換されます。