查看源代码 异常 行为 (Elixir v1.16.2)

用于格式化 throw/catch/exit 和异常的函数。

请注意,Elixir 中的堆栈跟踪只能在使用 __STACKTRACE__/0 变量的 catch 和 rescue 内部获得。

不要依赖于此模块中 format* 函数返回的特定格式。为了更好地适应 Elixir 的工具链,它们可能会在未来的版本中发生变化。换句话说,通过使用此模块中的函数,可以保证您会按照当前使用的 Elixir 版本的格式来格式化异常。

摘要

回调

Exception.blame/3 调用,以增强异常结构。

接收传递给 raise/2 的参数,并返回异常结构。

接收异常结构,并必须返回其消息。

函数

为异常附加信息以进行额外调试。

指责给定模块、函数和参数的调用。

规范化和格式化 throw/errors/exits 和堆栈跟踪。

规范化和格式化任何 throw/error/exit。

格式化 exit。它返回一个字符串。

接收匿名函数和元数,并按照堆栈跟踪中显示的方式对其进行格式化。元数也可以是参数列表。

按照堆栈跟踪中显示的方式格式化给定的 fileline

按照堆栈跟踪中显示的方式格式化给定的 filelinecolumn

接收模块、函数和元数,并按照堆栈跟踪中显示的方式对其进行格式化。元数也可以是参数列表。

格式化堆栈跟踪。

接收堆栈跟踪条目,并将其格式化为字符串。

获取 exception 的消息。

规范化异常,将 Erlang 异常转换为 Elixir 异常。

类型

@type arity_or_args() :: non_neg_integer() | list()
@type kind() :: :error | non_error_kind()

由格式化函数处理的类型

@type location() :: keyword()
@type non_error_kind() :: :exit | :throw | {:EXIT, pid()}
@type stacktrace() :: [stacktrace_entry()]
@type stacktrace_entry() ::
  {module(), atom(), arity_or_args(), location()}
  | {(... -> any()), arity_or_args(), location()}
@type t() :: %{
  :__struct__ => module(),
  :__exception__ => true,
  optional(atom()) => any()
}

异常类型

回调

链接到此回调

blame(t, stacktrace)

查看源代码 (可选)
@callback blame(t(), stacktrace()) :: {t(), stacktrace()}

Exception.blame/3 调用,以增强异常结构。

可用于收集有关异常的更多信息或执行一些额外的昂贵计算。

@callback exception(term()) :: t()

接收传递给 raise/2 的参数,并返回异常结构。

默认实现接受一组关键字参数,这些参数将合并到结构中,或者接受一个字符串,用作异常的消息。

@callback message(t()) :: String.t()

接收异常结构,并必须返回其消息。

最常见的异常有一个消息字段,默认情况下由此函数访问。但是,如果异常没有消息字段,则必须显式实现此函数。

函数

链接到此函数

blame(kind, error, stacktrace)

查看源代码 (自 1.5.0 起)
@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)

查看源代码 (自 1.5.0 起)
@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 \\ [])

查看源代码
@spec format(kind(), any(), stacktrace()) :: String.t()

规范化和格式化 throw/errors/exits 和堆栈跟踪。

它依赖于 format_banner/3format_stacktrace/1 来生成最终格式。

如果 kind{:EXIT, pid},它不会生成堆栈跟踪,因为此类 exit 是作为没有堆栈跟踪的消息检索到的。

链接到此函数

format_banner(kind, exception, stacktrace \\ [])

查看源代码
@spec format_banner(kind(), any(), stacktrace()) :: String.t()

规范化和格式化任何 throw/error/exit。

消息以与 Elixir 的 CLI 使用的相同格式进行格式化和显示。

第三个参数是堆栈跟踪,用于使用更多信息丰富规范化的错误。它仅在类型为错误时使用。

@spec format_exit(any()) :: String.t()

格式化 exit。它返回一个字符串。

通常,exit 中会有错误/异常。exit 通常由调用者包装,并提供堆栈跟踪。此函数以一种清晰的方式格式化 exit,以显示 exit 原因、调用者和堆栈跟踪。

@spec format_fa((... -> any()), arity()) :: String.t()

接收匿名函数和元数,并按照堆栈跟踪中显示的方式对其进行格式化。元数也可以是参数列表。

示例

Exception.format_fa(fn -> nil end, 1)
#=> "#Function<...>/1"
链接到此函数

format_file_line(file, line, suffix \\ "")

查看源代码
@spec format_file_line(String.t() | nil, non_neg_integer() | nil, String.t()) ::
  String.t()

按照堆栈跟踪中显示的方式格式化给定的 fileline

如果任何值为 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 \\ "")

查看源代码
@spec format_file_line_column(
  String.t() | nil,
  non_neg_integer() | nil,
  non_neg_integer() | nil,
  String.t()
) :: String.t()

按照堆栈跟踪中显示的方式格式化给定的 filelinecolumn

如果任何值为 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)

查看源代码
@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 是封闭函数的名称。转换为 "anonymous fn in func/arity"

链接到此函数

format_stacktrace(trace \\ nil)

查看源代码
@spec format_stacktrace(stacktrace() | nil) :: String.t()

格式化堆栈跟踪。

必须提供堆栈跟踪作为参数。如果没有,则从 Process.info/2 中检索堆栈跟踪。

链接到此函数

format_stacktrace_entry(entry)

查看源代码
@spec format_stacktrace_entry(stacktrace_entry()) :: String.t()

接收堆栈跟踪条目,并将其格式化为字符串。

@spec message(t()) :: String.t()

获取 exception 的消息。

链接到此函数

normalize(kind, payload, stacktrace \\ [])

查看源代码
@spec normalize(:error, any(), stacktrace()) :: t()
@spec normalize(non_error_kind(), payload, stacktrace()) :: payload when payload: var

规范化异常,将 Erlang 异常转换为 Elixir 异常。

它以 catch 溢出的 kind 作为参数,仅规范化 :error,并为其他类型返回未经修改的有效负载。

第三个参数是堆栈跟踪,用于使用更多信息丰富规范化的错误。它仅在类型为错误时使用。