【发布时间】:2011-10-15 03:16:37
【问题描述】:
我正在用 Erlang 编写一个 REST 服务,需要先验证接收到的数据,然后再将其传递给其他内部函数进行进一步处理;为了做到这一点,我目前正在使用这样的嵌套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 服务在每次有人向它抛出无效参数时崩溃并重新启动。
但是,我正在考虑放弃所有 cases,转而使用保护伞 try/catch 阻止捕获任何 badmatch 错误 - 这可行吗?
fun() ->
true = all_args_defined(Args),
{ok, _} = action(Args).
%% somewhere else
catch fun().
【问题讨论】:
-
只是对“让它崩溃”哲学的评论:如果您编写的代码本身无法对错误做任何明智的事情(例如您个人操作的代码),您应该为成功案例,如果有问题就让它崩溃。这使代码保持简短和集中。然而,在某些时候,您会想要处理错误——比如在主管中,或者在您的 REST 接收-执行-回复循环中。然后,您使用链接或 try/catch 进行设置,以便将错误传播到该点并仅在那里处理。
-
是的,这是有道理的——我只是被其他…跨度>
标签: exception-handling error-handling erlang