Точный тип исключения для деления на ноль в Эрланге - PullRequest
0 голосов
/ 05 июля 2018

Я хочу отловить ошибку деления на ноль, но не знаю, какой именно шаблон мне следует написать для этого

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

Это работает, когда я перехватываю все исключения через

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

но первый пример дает

** ошибка исключения: при вычислении арифметического выражения произошла ошибка

Так как правильно поймать деление на ноль

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Если вас интересует точное исключение, которое выдается, вы всегда можете узнать таким образом

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 в большинстве случаев в наше время. Это считается устаревшим выражением и хранится в основном для обратной совместимости и небольшого специального использования.

0 голосов
/ 05 июля 2018

Вы можете использовать этот код, который я получил от 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. 
...