English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В любой языковой программе необходимо обрабатывать исключения для обработки ошибок времени выполнения, чтобы поддерживать нормальный поток приложения. Исключения часто прерывают нормальный поток приложения, именно поэтому нам нужно использовать обработку исключений в приложении.
Обычно, когда в 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}]