I’m writing a REST service in Erlang and need to verify the received data before passing it to other internal functions for further processing; in order to do that, I’m currently using nested case expressions like this:
case all_args_defined(Args) of
true ->
ActionSuccess = action(Args),
case ActionSuccess of
{ok, _} -> ...;
{fail, reason} -> {fail, reason}
end,
_ ->
{fail, "args not defined"}
end,
...
I realize this is kind of ugly, but this way I can provide detailed error messages. Additionally, I don’t think the usual make it crash philosophy is applicable here – I don’t want my REST service to crash and be restarted every time somebody throws invalid arguments at it.
However, I’m considering abandoning all those cases in favor of an umbrella try/catch block catching any badmatch errors – would this work?
fun() ->
true = all_args_defined(Args),
{ok, _} = action(Args).
%% somewhere else
catch fun().
Since what you want to achieve is error reporting, you should structure the thing around the execution of actions and reporting of the result. Perhaps something like this: