Erlang 中被零除的精确异常类型
Precise exception type for division by zero in Erlang
我想捕获零除法错误,但不知道我应该为此编写哪种确切模式
Result = try 5/0 catch {'EXIT',{badarith,_}} -> 0.
当我通过
捕获所有异常时,它会起作用
Result = try 5/0 catch _:_ -> 0.
但是第一个例子给出了
** exception error: an error occurred when evaluating an arithmetic expression
那么如何正确捕捉零除
您可以使用我从 http://learnyousomeerlang.com/errors-and-exceptions
获得的代码
catcher(X,Y) ->
case catch X/Y of
{'EXIT', {badarith,_}} -> "uh oh";
N -> N
end.
6> c(exceptions).
{ok,exceptions}
7> exceptions:catcher(3,3).
1.0
8> exceptions:catcher(6,3).
2.0
9> exceptions:catcher(6,0).
"uh oh"
或
catcher(X, Y) ->
try
X/Y
catch
error:badarith -> 0
end.
如果你对抛出的确切异常感到好奇,你总是可以通过这种方式找到
1> try 5/0 catch Class:Reason -> {Class, Reason} end.
{error,badarith}
2> try 5/0 catch error:badarith -> ok end.
ok
3> try hd(ok), 5/0 catch error:badarith -> ok end.
** exception error: bad argument
4> try hd(ok), 5/0 catch Class2:Reason2 -> {Class2, Reason2} end.
{error,badarg}
5> try hd(ok), 5/0 catch error:badarg -> ok end.
ok
顺便说一句,现在大多数情况下你不应该使用 catch
表达式。它被认为是过时的表达式,主要是为了向后兼容和少数特殊用途而保留。
我想捕获零除法错误,但不知道我应该为此编写哪种确切模式
Result = try 5/0 catch {'EXIT',{badarith,_}} -> 0.
当我通过
捕获所有异常时,它会起作用Result = try 5/0 catch _:_ -> 0.
但是第一个例子给出了
** exception error: an error occurred when evaluating an arithmetic expression
那么如何正确捕捉零除
您可以使用我从 http://learnyousomeerlang.com/errors-and-exceptions
获得的代码catcher(X,Y) ->
case catch X/Y of
{'EXIT', {badarith,_}} -> "uh oh";
N -> N
end.
6> c(exceptions).
{ok,exceptions}
7> exceptions:catcher(3,3).
1.0
8> exceptions:catcher(6,3).
2.0
9> exceptions:catcher(6,0).
"uh oh"
或
catcher(X, Y) ->
try
X/Y
catch
error:badarith -> 0
end.
如果你对抛出的确切异常感到好奇,你总是可以通过这种方式找到
1> try 5/0 catch Class:Reason -> {Class, Reason} end.
{error,badarith}
2> try 5/0 catch error:badarith -> ok end.
ok
3> try hd(ok), 5/0 catch error:badarith -> ok end.
** exception error: bad argument
4> try hd(ok), 5/0 catch Class2:Reason2 -> {Class2, Reason2} end.
{error,badarg}
5> try hd(ok), 5/0 catch error:badarg -> ok end.
ok
顺便说一句,现在大多数情况下你不应该使用 catch
表达式。它被认为是过时的表达式,主要是为了向后兼容和少数特殊用途而保留。