Joe Armstrong の提案の 1 つ: エラー処理から分離されたプログラム成功ケース コード。こんな感じで作れます
create_user(Email, UserName, Password) ->
try
ok = new_email(Email),
ok = valid_user_name(UserName),
ok = new_user(UserName),
ok = strong_password(Password),
...
_create_user(Email, UserName, Password)
catch
error:{badmatch, email_in_use} -> do_something();
error:{badmatch, invalid_user_name} -> do_something();
error:{badmatch, user_exists} -> do_something();
error:{badmatch, weak_password} -> do_something();
...
end.
create_user 関数からすべてのエラーキャッチを実行できることに注意してください。
create_user(Email, UserName, Password) ->
ok = new_email(Email),
ok = valid_user_name(UserName),
ok = new_user(UserName),
ok = strong_password(Password),
...
_create_user(Email, UserName, Password).
main() ->
try
...
some_function_where_create_user_is_called(),
...
catch
...
error:{badmatch, email_in_use} -> do_something();
error:{badmatch, invalid_user_name} -> do_something();
error:{badmatch, user_exists} -> do_something();
error:{badmatch, weak_password} -> do_something();
...
end.
パターン マッチは、Erlang で最もクールな機能の 1 つです。タグを不正一致エラーに含めることができることに注意してください
{my_tag, ok} = {my_tag, my_call(X)}
カスタムデータも
{my_tag, ok, X} = {my_tag, my_call(X), X}
例外が十分に速いかどうかは、期待に依存します。私の 2.2GHz Core2 Duo Intel の速度: 1 秒間に約 200 万回の例外 (0.47us) と比較して、600 万回の (外部) 関数呼び出しの成功 (0.146us) - 例外処理には約 0.32us かかると推測できます。ネイティブ コードでは、1 秒あたり 6.8 対 4,700 万であり、処理には約 0.125us かかります。try-catch コンストラクトには、ネイティブ コードとバイト コードの両方で関数呼び出しが成功するまでに約 5 ~ 10% の追加コストがかかる可能性があります。