Error handling 抛出和捕获在处理异常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)

我有下面这样一个简单的代码来测试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.
当我用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,非常感谢。我有两个关于透析器的问题,不知道如何修理。你好,理查德,非常感谢你。我有两个关于透析器的问题,不知道如何修理。