查看源代码 异常 行为 (Elixir v1.16.2)
用于格式化 throw/catch/exit 和异常的函数。
请注意,Elixir 中的堆栈跟踪只能在使用 __STACKTRACE__/0
变量的 catch 和 rescue 内部获得。
不要依赖于此模块中 format*
函数返回的特定格式。为了更好地适应 Elixir 的工具链,它们可能会在未来的版本中发生变化。换句话说,通过使用此模块中的函数,可以保证您会按照当前使用的 Elixir 版本的格式来格式化异常。
摘要
函数
为异常附加信息以进行额外调试。
指责给定模块、函数和参数的调用。
规范化和格式化 throw/errors/exits 和堆栈跟踪。
规范化和格式化任何 throw/error/exit。
格式化 exit。它返回一个字符串。
接收匿名函数和元数,并按照堆栈跟踪中显示的方式对其进行格式化。元数也可以是参数列表。
按照堆栈跟踪中显示的方式格式化给定的 file
和 line
。
按照堆栈跟踪中显示的方式格式化给定的 file
、line
和 column
。
接收模块、函数和元数,并按照堆栈跟踪中显示的方式对其进行格式化。元数也可以是参数列表。
格式化堆栈跟踪。
接收堆栈跟踪条目,并将其格式化为字符串。
获取 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()}
异常类型
回调
@callback blame(t(), stacktrace()) :: {t(), stacktrace()}
从 Exception.blame/3
调用,以增强异常结构。
可用于收集有关异常的更多信息或执行一些额外的昂贵计算。
接收传递给 raise/2
的参数,并返回异常结构。
默认实现接受一组关键字参数,这些参数将合并到结构中,或者接受一个字符串,用作异常的消息。
接收异常结构,并必须返回其消息。
最常见的异常有一个消息字段,默认情况下由此函数访问。但是,如果异常没有消息字段,则必须显式实现此函数。
函数
@spec blame(:error, any(), stacktrace()) :: {t(), stacktrace()}
@spec blame(non_error_kind(), payload, stacktrace()) :: {payload, stacktrace()} when payload: var
为异常附加信息以进行额外调试。
此操作可能很昂贵,因为它会从文件系统读取数据,解析 beam 文件,评估代码等。
如果异常模块实现了可选的 blame/2
回调,它将被调用以执行计算。
@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
。
@spec format(kind(), any(), stacktrace()) :: String.t()
规范化和格式化 throw/errors/exits 和堆栈跟踪。
它依赖于 format_banner/3
和 format_stacktrace/1
来生成最终格式。
如果 kind
是 {:EXIT, pid}
,它不会生成堆栈跟踪,因为此类 exit 是作为没有堆栈跟踪的消息检索到的。
@spec format_banner(kind(), any(), stacktrace()) :: String.t()
规范化和格式化任何 throw/error/exit。
消息以与 Elixir 的 CLI 使用的相同格式进行格式化和显示。
第三个参数是堆栈跟踪,用于使用更多信息丰富规范化的错误。它仅在类型为错误时使用。
格式化 exit。它返回一个字符串。
通常,exit 中会有错误/异常。exit 通常由调用者包装,并提供堆栈跟踪。此函数以一种清晰的方式格式化 exit,以显示 exit 原因、调用者和堆栈跟踪。
接收匿名函数和元数,并按照堆栈跟踪中显示的方式对其进行格式化。元数也可以是参数列表。
示例
Exception.format_fa(fn -> nil end, 1)
#=> "#Function<...>/1"
@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)
""
@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)
""
@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"
@spec format_stacktrace(stacktrace() | nil) :: String.t()
格式化堆栈跟踪。
必须提供堆栈跟踪作为参数。如果没有,则从 Process.info/2
中检索堆栈跟踪。
@spec format_stacktrace_entry(stacktrace_entry()) :: String.t()
接收堆栈跟踪条目,并将其格式化为字符串。
获取 exception
的消息。
@spec normalize(:error, any(), stacktrace()) :: t()
@spec normalize(non_error_kind(), payload, stacktrace()) :: payload when payload: var
规范化异常,将 Erlang 异常转换为 Elixir 异常。
它以 catch
溢出的 kind
作为参数,仅规范化 :error
,并为其他类型返回未经修改的有效负载。
第三个参数是堆栈跟踪,用于使用更多信息丰富规范化的错误。它仅在类型为错误时使用。