Одно из предложений Джо Армстронга: код примера успеха программы отделен от обработки ошибок. Вы можете сделать это таким образом
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.
Сопоставление с образцом - одна из самых крутых вещей в Эрланге. Обратите внимание, что вы можете включить ваш тег в ошибку badmatch
{my_tag, ok} = {my_tag, my_call(X)}
и пользовательские данные тоже
{my_tag, ok, X} = {my_tag, my_call(X), X}
Если исключение достаточно быстро для вас, зависит от ваших ожиданий. Скорость на моем 2,2 ГГц Core2 Duo Intel:
около 2 миллионов исключений в секунду (0,47 мкс) по сравнению с 6 миллионами успешных (внешних) вызовов функций (0,146 мкс) - можно предположить, что обработка исключений занимает около 0,32 мкс.
В нативном коде это 6,8 против 47 миллионов в секунду, а обработка может занять около 0,125us. Может потребоваться дополнительная плата за конструкцию try-catch, которая составляет около 5-10% от вызова функции success как в собственном, так и в байт-коде.