Философия обработки ошибок в Erlang - case vs throw

Я пишу службу REST в Erlang, и мне нужно проверить полученные данные, прежде чем передавать их другим внутренним функциям для дальнейшей обработки; для этого я m в настоящее время использует вложенные выражения case вроде этого:

case all_args_defined(Args) of
    true ->
        ActionSuccess = action(Args),

        case ActionSuccess of
            {ok, _} -> ...;
            {fail, reason} -> {fail, reason}
        end,
    _ ->
        {fail, "args not defined"}
end,
...

Я понимаю, что это некрасиво, но таким образом я могу предоставить подробные сообщения об ошибках. Кроме того, я не думаю, что обычный делает это Здесь применима философия сбоя - я не хочу, чтобы моя служба REST аварийно завершала работу и перезапускалась каждый раз, когда кто-то бросает ей недопустимые аргументы.

Однако я рассматриваю g отказавшись от всех этих случаев в пользу зонтичного try / catch блока, улавливающего любые плохие совпадения ошибки - это сработает?

fun() ->
    true = all_args_defined(Args),
    {ok, _} = action(Args).

%% somewhere else
catch fun().
6
задан Philip Kamenarsky 28 July 2011 в 13:22
поделиться