我有一个简单的代码,如下所示来测试Erlang如何处理异常。投掷和接球的 **** 引用。
-module(exception).
-export([sum/2]).
-export([is_odd/1]).
sum(A, B) ->
case is_odd(A) of
odd ->
2*A+B;
Result ->
Result
end.
is_odd(A) ->
case is_integer(A) of
true ->
odd;
_ -> ****({error, "Input error"})
end.
当我用投掷运行透析器时,它显示警告:
exception.erl:9:变量 Result 自上一个以来永远无法匹配 条款完全涵盖了"奇数"类型
可以通过添加来修复此警告
案件捕获
为了功能乐趣/2.
当我用渔获液运行透析器时,透析器成功通过。
我想知道一些关于接球和投掷的事情。我们应该扔或接住哪种情况?
如果你使用 throw(对于 ****),你的函数 is_odd(A) 只会返回一个正常值:原子 'odd'。这就是透析器告诉你的:第 9 行(结果 ->)中的子句永远不匹配。如果 is_odd(A) 返回一个值,则该值必须是"odd",因此将始终选择第一个子句。
如果您编写"case catch is_odd(A) of ...",则任何抛出的异常都将被捕获并转换为值。在您的情况下,这是元组 {错误,"输入错误"}。(请注意,这是一个"旧式"catch Expression
,通常首选在所有新代码中使用现代try ... catch ... end
。现在突然又有两个可能的值,也可以选择第 9 行的子句,所以透析器不会抱怨。
通常,对相对罕见的情况使用异常,对常见事物使用正常返回值。但是,有时使用异常作为跳跃("非本地返回")来摆脱深度递归可能是一个好主意。