Error handling 抛出和捕获在处理异常Erlang时的不同
我有下面这样一个简单的代码来测试Erlang如何处理异常。投掷和接球的****参考Error handling 抛出和捕获在处理异常Erlang时的不同,error-handling,erlang,runtime-error,dialyzer,Error Handling,Erlang,Runtime Error,Dialyzer,我有下面这样一个简单的代码来测试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)
-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.
当我用THOW运行透析器时,它显示警告:
异常。erl:9:变量结果自上一个变量以来无法匹配
条款完全涵盖了“奇数”类型
此警告可以通过添加
案例捕获
为了好玩/2
当我用接住透析器时,透析器顺利通过
我对接球和投掷有点好奇。你该投哪种球或接住哪种球 如果使用throw(对于****),则函数is_odd(A)将只返回一个正常值:原子“odd”。这就是透析器告诉您的:第9行的条款(结果->)永远不会匹配。如果is_odd(A)返回一个值,它必须是“odd”,因此将始终选择第一个子句
如果您编写“case catch is_odd(A)of…”,则任何抛出的异常都将被捕获并转换为值。在您的例子中,这是元组{error,“Input error”}。(请注意,这是一种“旧式”catch表达式
,通常更倾向于在所有新代码中使用现代的try…catch…end
。)现在,突然又出现了两个可能的值,第9行的子句也可以选择,因此透析器不会抱怨
通常,对于相对罕见的情况使用异常,对于常见情况使用正常返回值。然而,有时使用异常作为跳远(“非局部返回”)以摆脱深度递归可能是一个好主意。如果使用throw(对于****),则函数is_odd(a)将只返回一个正常值:原子“odd”。这就是透析器告诉您的:第9行的条款(结果->)永远不会匹配。如果is_odd(A)返回一个值,它必须是“odd”,因此将始终选择第一个子句
如果您编写“case catch is_odd(A)of…”,则任何抛出的异常都将被捕获并转换为值。在您的例子中,这是元组{error,“Input error”}。(请注意,这是一种“旧式”catch表达式
,通常更倾向于在所有新代码中使用现代的try…catch…end
。)现在,突然又出现了两个可能的值,第9行的子句也可以选择,因此透析器不会抱怨
通常,对于相对罕见的情况使用异常,对于常见情况使用正常返回值。然而,有时使用异常作为跳转(“非局部返回”)来摆脱深层递归可能是个好主意。你好,Richard,非常感谢。我有两个关于透析器的问题,不知道如何修理。你好,理查德,非常感谢你。我有两个关于透析器的问题,不知道如何修理。