精确的异常类型,在Erlang中被零除

时间:2018-07-05 10:07:44

标签: exception-handling erlang erl eshell

我想捕获零除错误,但不知道该为哪个确切的模式写

Result = try 5/0 catch {'EXIT',{badarith,_}} -> 0.

当我通过捕获所有异常时,它会起作用

Result = try 5/0 catch _:_ -> 0.

但第一个示例给出

  

**异常错误:计算算术表达式时发生错误

那么如何正确捕捉零除

2 个答案:

答案 0 :(得分:4)

您可以使用我从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"

OR

catcher(X, Y) -> 
  try 
   X/Y 
  catch 
   error:badarith -> 0 
  end. 

答案 1 :(得分:2)

如果您对抛出的确切异常感到好奇,您总是可以通过这种方式找出答案

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表达式。它被认为是过时的表达,并且保留主要是为了向后兼容和少量特殊用途。