Исходный код Исключение поведение
Функции для работы с throw/catch/exit и исключениями.
Этот модуль также определяет поведение, необходимое для пользовательских исключений. Чтобы определить свои собственные, см. defexception/1.
Функции форматирования
Несколько функций в этом модуле помогают форматировать исключения. Некоторые из этих функций ожидают в качестве аргумента трассировку стека. Трассировка стека обычно доступна внутри catch и rescue с использованием переменной __STACKTRACE__/0.
Не полагайтесь на конкретный формат, возвращаемый функциями в этом модуле. Они могут быть изменены в будущих версиях для лучшей адаптации к инструменту Elixir. Другими словами, используя функции в этом модуле, гарантируется, что вы будете форматировать исключения так, как это делает текущая версия Elixir.
Краткое описание
Типы
Обработчики
- blame(t, stacktrace)
Вызывается из
Exception.blame/3для дополнения структуры исключения.- exception(term)
Получает аргументы, переданные в
raise/2, и возвращает структуру исключения.- message(t)
Получает структуру исключения и должна вернуть его сообщение.
Функции
- blame(kind, error, stacktrace)
Прикрепляет информацию к исключениям для дополнительной отладки.
- blame_mfa(module, function, args)
Приписывает вину вызову данного модуля, функции и аргументов.
- format(kind, payload, stacktrace \\ [])
Нормализует и форматирует throw/ошибки/выходы и трассировки стека.
- format_banner(kind, exception, stacktrace \\ [])
Нормализует и форматирует любой throw/ошибку/выход.
- format_exit(reason)
Форматирует выход. Возвращает строку.
- format_fa(fun, arity)
Получает анонимную функцию и арность и форматирует её так, как показано в трассировках стека. Арность также может быть списком аргументов.
- format_file_line(file, line, suffix \\ "")
Форматирует заданный
fileиlineтак, как показано в трассировках стека.- format_file_line_column(file, line, column, suffix \\ "")
Форматирует заданные
file,line, иcolumnтак, как показано в трассировках стека.- format_mfa(module, fun, arity)
Получает модуль, функцию и арность и форматирует их так, как показано в трассировках стека. Арность также может быть списком аргументов.
- format_stacktrace(trace \\ nil)
Форматирует трассировку стека.
- format_stacktrace_entry(entry)
Получает элемент трассировки стека и форматирует его в строку.
- message(exception)
Получает сообщение для
exception.- normalize(kind, payload, stacktrace \\ [])
Нормализует исключение, преобразуя Erlang-исключения в Elixir-исключения.
Типы
arity_or_args()Исходный код
@type arity_or_args() :: non_neg_integer() | list()
kind()Исходный код
@type kind() :: :error | non_error_kind()
Тип, обрабатываемый функциями форматирования
location()Исходный код
@type location() :: keyword()
non_error_kind()Исходный код
@type non_error_kind() :: :exit | :throw | {:EXIT, pid()} stacktrace()Исходный код
@type stacktrace() :: [stacktrace_entry()]
stacktrace_entry()Исходный код
@type stacktrace_entry() ::
{module(), atom(), arity_or_args(), location()}
| {(... -> any()), arity_or_args(), location()} t()Исходный код
@type t() :: %{
:__struct__ => module(),
:__exception__ => true,
optional(atom()) => any()
} Тип исключения
Обработчики
blame(t, stacktrace)Исходный код
@callback blame(t(), stacktrace()) :: {t(), stacktrace()} Вызывается из Exception.blame/3 для дополнения структуры исключения.
Может использоваться для сбора дополнительной информации об исключении или выполнения дополнительных дорогостоящих вычислений.
exception(term)Исходный код
@callback exception(term()) :: t()
Получает аргументы, переданные в raise/2, и возвращает структуру исключения.
По умолчанию реализация принимает либо набор ключевых аргументов, который объединяется в структуру, либо строку, которая будет использоваться в качестве сообщения исключения.
message(t)Исходный код
@callback message(t()) :: String.t()
Получает структуру исключения и должна вернуть его сообщение.
Многие исключения имеют поле message, которое по умолчанию обращается к этой функции. Однако, если исключение не имеет поля message, эта функция должна быть явно реализована.
Функции
blame(kind, error, stacktrace)Source
@spec blame(:error, any(), stacktrace()) :: {t(), stacktrace()} @spec blame(non_error_kind(), payload, stacktrace()) :: {payload, stacktrace()}
when payload: var Присоединяет информацию к исключениям для дополнительной отладки.
Эта операция потенциально ресурсоемкая, так как она считывает данные из файловой системы, парсит файлы BEAM, оценивает код и так далее.
Если модуль исключения реализует необязательный обратный вызов blame/2, он будет вызван для выполнения вычислений.
blame_mfa(module, function, args)Source
@spec blame_mfa(module(), function :: atom(), args :: [term()]) ::
{:ok, :def | :defp | :defmacro | :defmacrop,
[{args :: [term()], guards :: [term()]}]}
| :error Присваивает вину вызову данного модуля, функции и аргументов.
Эта функция извлечёт доступные варианты из байткода и проверит их на соответствие заданным аргументам. Варианты возвращаются как список пар {args, guards} где каждый аргумент и каждое условие верхнего уровня в условии, разделённые and/or, заключены в кортеж с метаданными о вине.
Эта функция возвращает либо {:ok, definition, clauses} либо :error. Где definition это :def, :defp, :defmacro или :defmacrop.
format(kind, payload, stacktrace \\ [])Source
@spec format(kind(), any(), stacktrace()) :: String.t()
Нормализует и форматирует выбросы/ошибки/выходы и трассировки стека.
Он полагается на format_banner/3 и format_stacktrace/1 для генерации окончательного формата.
Если kind это {:EXIT, pid}, он не генерирует трассировку стека, так как такие выходы извлекаются как сообщения без трассировок стека.
format_banner(kind, exception, stacktrace \\ [])Source
@spec format_banner(kind(), any(), stacktrace()) :: String.t()
Нормализует и форматирует любой выброс/ошибку/выход.
Сообщение форматируется и отображается в том же формате, что и в командной строке Elixir.
Третий аргумент — трассировка стека, которая используется для обогащения нормализованной ошибки дополнительной информацией. Она используется только в случае, если тип — ошибка.
format_exit(reason)Source
@spec format_exit(any()) :: String.t()
Форматирует выход. Возвращает строку.
Часто внутри выходов имеются ошибки/исключения. Выходы часто оборачиваются вызывающей стороной и также содержат трассировки стека. Эта функция форматирует выходы таким образом, чтобы красиво отобразить причину выхода, вызывающую сторону и трассировку стека.
format_fa(fun, arity)Source
@spec format_fa(fun(), arity()) :: String.t()
Принимает анонимную функцию и арность и форматирует её, как показано в трассировках стека. Арность также может быть списком аргументов.
Примеры
Exception.format_fa(fn -> nil end, 1) #=> "#Function<...>/1"
format_file_line(file, line, suffix \\ "")Source
@spec format_file_line(String.t() | nil, non_neg_integer() | nil, String.t()) :: String.t()
Форматирует заданный file и line в виде, представленном в трассировках стека.
Если какие-либо из значений являются nil, они опускаются.
Примеры
iex> Exception.format_file_line("foo", 1)
"foo:1:"
iex> Exception.format_file_line("foo", nil)
"foo:"
iex> Exception.format_file_line(nil, nil)
"" format_file_line_column(file, line, column, suffix \\ "")Source
@spec format_file_line_column( String.t() | nil, non_neg_integer() | nil, non_neg_integer() | nil, String.t() ) :: String.t()
Форматирует заданный file, line, и column в виде, представленном в трассировках стека.
Если какие-либо из значений являются nil, они опускаются.
Примеры
iex> Exception.format_file_line_column("foo", 1, 2)
"foo:1:2:"
iex> Exception.format_file_line_column("foo", 1, nil)
"foo:1:"
iex> Exception.format_file_line_column("foo", nil, nil)
"foo:"
iex> Exception.format_file_line_column("foo", nil, 2)
"foo:"
iex> Exception.format_file_line_column(nil, nil, nil)
"" format_mfa(module, fun, arity)Source
@spec format_mfa(module(), atom(), arity_or_args()) :: String.t()
Принимает модуль, функцию и арность и форматирует их в виде, представленном в трассировках стека. Арность также может быть списком аргументов.
Примеры
iex> Exception.format_mfa(Foo, :bar, 1) "Foo.bar/1" iex> Exception.format_mfa(Foo, :bar, []) "Foo.bar()" iex> Exception.format_mfa(nil, :bar, []) "nil.bar()"
Анонимные функции отображаются как -func/arity-anonfn-count-, где func — имя функции-оболочки. Перевод: "анонимная функция в func/arity"
format_stacktrace(trace \\ nil)Source
@spec format_stacktrace(stacktrace() | nil) :: String.t()
Форматирует трассировку стека.
Трассировка стека должна быть задана в качестве аргумента. Если нет, трассировка стека извлекается из Process.info/2.
format_stacktrace_entry(entry)Source
@spec format_stacktrace_entry(stacktrace_entry()) :: String.t()
Принимает элемент трассировки стека и форматирует его в строку.
message(exception)Source
@spec message(t()) :: String.t()
Получает сообщение для exception.
normalize(kind, payload, stacktrace \\ [])Source
@spec normalize(:error, any(), stacktrace()) :: t()
@spec normalize(non_error_kind(), payload, stacktrace()) :: payload when payload: var
Нормализует исключение, преобразуя Erlang-исключения в Elixir-исключения.
Принимает kind выброшенное catch как аргумент и нормализует только :error, возвращая нетронутый payload для других.
Третий аргумент — трассировка стека, которая используется для обогащения нормализованной ошибки дополнительной информацией. Она используется только в случае, если тип — ошибка.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/Exception.html