English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Экзепшены (Exceptions) Erlang

В любой языковой программе необходимо обрабатывать исключения для обработки ошибок времени выполнения, чтобы поддерживать нормальный поток приложения. Исключения часто прерывают нормальный поток приложения, именно поэтому нам нужно использовать обработку исключений в приложении.

Обычно, когда в Erlang происходит исключение или ошибка, отображается следующее сообщение.

{"init terminating in do_boot", {undef,[{helloworld,start,[],[]}, 
{init,start_it,1,[]},{init,start_em,1,[]}]}}

dump Fault будет записан в-

erl_crash.dump
init terminating in do_boot ()

В Erlang существует три типа исключений-

  • Error− Вызов будет завершать выполнение текущего процесса и включать в себя трассировку стека, когда последний вызов и его параметры будут捕获ены. Это исключения, вызывающие вышеупомянутые ошибки времени выполнения.erlang:error(Reason)

  • Existence − Existence существует два типа: внутренний выход и внешний выход. Внутренний выход активируется вызовом функции exit/1 и останавливает текущий процесс. Внешний выход вызывается в exit/2 и связан с параллельными процессами Erlang.

  • Throw −throw — это класс исключений, которые могут быть обработаны программистом. В отличие от выхода и ошибок, они не вызывают никакой «процесс крушения!», их намерение — контролировать поток. Обычно лучше записывать использование throw в модуле, в котором они используются, когда ожидается, что программист будет обрабатывать выбросы.

try... catch — это способ вычисления выражения, который позволяет вам обрабатывать успешные случаи и встречающиеся ошибки.

Общий грамматический вид try-catch выражения показан ниже.

грамматика

try Expression of 
SuccessfulPattern1 [Guards] -> 
Expression1; 
SuccessfulPattern2 [Guards] -> 
Expression2 
catch TypeOfError:ExceptionPattern1 -> 
Expression3; 
TypeOfError:ExceptionPattern2 -> 
Expression4 
end

Выражение, находящееся между try и of, называется защищенным. Это означает, что любая форма исключения, которая возникает в этом вызове, будет捕获ена. Паттерн и выражение между try... и catch ведут себя так же, как и в случае case...

Наконец, часть catch — здесь вы можете заменить TypeOfError на error, throw или exit для каждого типа, которые вы видели в этой главе. Если тип не указан, предполагается выброс.

ErrorТип ошибки
badarg

Неправильный тип данных параметра или неправильный формат.

badarith

Ошибка параметров арифметического выражения.

{badmatch,V}

Оценка выражения не успешна. Значение V не соответствует.

function_clauseНе удается найти соответствующий раздел при оценке вызова функции.
{case_clause,V}

Не удается найти соответствующий раздел при расчете выражения case. Значение V не соответствует.

if_clauseНе удается найти истинный раздел при оценке выражения if.
{try_clause,V}

Не удается найти соответствующий раздел при расчете节的 выражения try. Значение V не соответствует.

undefНе удается найти функцию при оценке вызова функции.
{badfun,F}Интересная функция вышла из строя
{badarit,F}

Забавная функция применяется к количеству ошибок параметров. F описывает удовольствие и спор.

timeout_valueВремя ожидания выражения receive..after рассчитывается как любое значение, кроме целого числа или бесконечности.
noprocПопытка enlace к процессу, который не существует.

Ниже приведен пример использования этих исключений и их обработки.

  • Первая функция генерирует все возможные типы исключений.

  • Затем мы пишем 包装器 функции, которая вызывает generate_exception в выражении try...catch.

Онлайн пример

-module(helloworld). 
-compile(export_all). 
generate_exception(1) -> a; 
generate_exception(2) -> throw(a); 
generate_exception(3) -> exit(a); 
generate_exception(4) -> {'EXIT', a}; 
generate_exception(5) -> erlang:error(a). 
demo1() -> 
   [catcher(I) || I <- [1,2,3,4,5]]. 
catcher(N) -> 
   try generate_exception(N) of 
      Val -> {N, normal, Val} 
   catch 
      throw:X -> {N, caught, thrown, X}; 
      exit:X -> {N, захвачено, выведен, X}; 
      ошибка:X -> {N, захвачено, ошибка, X} 
   конец. 
      
demo2() -> 
   [{I, (catch generate_exception(I))} || I <- [1,2,3,4,5]]. 
demo3() -> 
   try generate_exception(5) 
   catch 
      ошибка:X -> 
         {X, erlang:get_stacktrace()} 
   конец. 
   
lookup(N) -> 
   case(N) of 
      1 -> {'EXIT', a}; 
      2 -> exit(a) 
   конец.

Если мы запустим программу HelloWorld:demo()., мы получим следующий вывод

[{1,нормально,a},
{2,захвачено,выброшено,a},
{3,захвачено,выход,a},
{4,нормально,{'EXIT',a}},
{5,захвачено,ошибка,a}]