[erlang-questions] How do I elegantly check many conditions?

Adam Lindberg <>
Mon Mar 23 13:39:40 CET 2009


----- "Hynek Vychodil" <> wrote:

> One of Joe's suggestion: program success case code separated from
> error
> handling. You can make it in this way
> 
> 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.

Why use badmatch?

create_user(Email, UserName, Password) ->
  try
    is_new_email(Email),
    is_valid_user_name(UserName),
    is_new_user(UserName),
    is_strong_password(Password),
    ...
    _create_user(Email, UserName, Password)
  catch
    email_in_use      -> do_something();
    invalid_user_name -> do_something();
    user_exists       -> do_something();
    weak_password     -> do_something();
    ...
  end.


Validation functions can use throw:

is_new_email(Email) ->
  case mnesia:dirty_read(email, Email) of
    []    -> ok;
    _Else -> throw(email_in_use)
  end.

Cheers,
Adam



More information about the erlang-questions mailing list