查看源码 erl_error 行为 (stdlib v6.2)

此模块提供用于美观打印错误和异常的函数。它被 shellproc_lib 用来打印异常。

引发错误的模块可以通过使用额外的错误信息调用 error/3 来提供额外的信息。有关此机制的更多详细信息,请参阅 EEP-54

回调函数

以下函数将从错误信息处理程序中导出。

摘要

类型

起始列号。默认值为 1。

用于格式化 BIF 和函数调用的函数参数的函数。默认情况下,将使用以下函数

包含格式化选项的映射。

用于修剪堆栈跟踪末尾的函数。它使用堆栈跟踪中的条目的模块、函数和 arity 调用。如果该条目应被修剪,则该函数应返回 true,否则返回 false。默认值为

回调

format_exception/4 或类似功能想要提供有关错误的额外信息时,将调用此回调。调用的 Module:Function 是由 error_info 映射指定的。

函数

以与 shell 格式化它们的方式相同的样式,格式化使用 try ... catch 捕获的错误原因和堆栈回溯。

类型

链接到此类型

column()

查看源码 (未导出) (自 OTP 24.0 起)
-type column() :: pos_integer().

起始列号。默认值为 1。

链接到此类型

format_fun()

查看源码 (自 OTP 24.0 起)
-type format_fun() :: fun((term(), column()) -> iolist()).

用于格式化 BIF 和函数调用的函数参数的函数。默认情况下,将使用以下函数

fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
链接到此类型

format_options()

查看源码 (自 OTP 24.0 起)
-type format_options() ::
          #{column => column(), stack_trim_fun => stack_trim_fun(), format_fun => format_fun()}.

包含格式化选项的映射。

链接到此类型

stack_trim_fun()

查看源码 (自 OTP 24.0 起)
-type stack_trim_fun() :: fun((module(), atom(), arity()) -> boolean()).

用于修剪堆栈跟踪末尾的函数。它使用堆栈跟踪中的条目的模块、函数和 arity 调用。如果该条目应被修剪,则该函数应返回 true,否则返回 false。默认值为

fun(_, _, _) -> false end

回调

链接到此回调

format_error(Reason, StackTrace)

查看源码 (自 OTP 24.0 起)
-callback format_error(Reason, StackTrace) -> ErrorDescription
                          when
                              Reason :: term(),
                              StackTrace :: erlang:stacktrace(),
                              ArgumentPosition :: pos_integer(),
                              ErrorDescription ::
                                  #{ArgumentPosition => unicode:chardata(),
                                    general => unicode:chardata(),
                                    reason => unicode:chardata()}.

format_exception/4 或类似功能想要提供有关错误的额外信息时,将调用此回调。调用的 Module:Function 是由 error_info 映射指定的。

该函数应返回一个包含有关导致异常的额外信息的映射。映射的可能键是

  • ArgumentPosition = pos_integer() - 从 1 开始,导致错误的参数的位置。

  • general - 未与任何参数关联的导致错误的错误。

  • reason - 如果 Reason 应该以不同于默认的方式打印。

如果返回的文本包含换行符,则 format_exception/4 将正确缩进文本。

示例

-module(my_error_module).
-export([atom_to_string/1, format_error/2]).

atom_to_string(Arg) when is_atom(Arg) ->
  atom_to_list(Arg);
atom_to_string(Arg) ->
  erlang:error(badarg,[Arg],
               [{error_info,#{ module => ?MODULE,
                               cause => #{ 1 => "should be an atom" }}}]).

format_error(Reason, [{_M,_F,_As,Info}|_]) ->
  ErrorInfo = proplists:get_value(error_info, Info, #{}),
  ErrorMap = maps:get(cause, ErrorInfo),
  ErrorMap#{ general => "optional general information",
             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
1> c(my_error_module).
{ok,my_error_module}
2> my_error_module:atom_to_string(1).
** exception error: my_error_module: badarg
     in function  my_error_module:atom_to_string/1
        called as my_error_module:atom_to_string(1)
        *** argument 1: should be an atom
        *** optional general information

函数

链接到此函数

format_exception(Class, Reason, StackTrace)

查看源码 (自 OTP 24.0 起)
-spec format_exception(Class, Reason, StackTrace) -> unicode:chardata()
                          when
                              Class :: error | exit | throw,
                              Reason :: term(),
                              StackTrace :: erlang:stacktrace().

等效于 format_exception/4

链接到此函数

format_exception(Class, Reason, StackTrace, Options)

查看源码 (自 OTP 24.0 起)
-spec format_exception(Class, Reason, StackTrace, Options) -> unicode:chardata()
                          when
                              Class :: error | exit | throw,
                              Reason :: term(),
                              StackTrace :: erlang:stacktrace(),
                              Options :: format_options().

以与 shell 格式化它们的方式相同的样式,格式化使用 try ... catch 捕获的错误原因和堆栈回溯。

示例

try
    do_something()
catch
    C:R:Stk ->
        Message = erl_error:format_exception(C, R, Stk),
        io:format(LogFile, "~ts\n", [Message])
end

如果异常提供了 error_info,则 format_exception 将使用该信息来提供有关异常的额外信息。

示例

try
  erlang:raise(badarg,[],[{error_info,#{}}])
catch
    C:R:Stk ->
        Message = erl_error:format_exception(C, R, Stk),
        io:format(LogFile, "~ts\n", [Message])
end

有关如何引发包含 error_info 的异常的详细信息,请参阅 erlang:error/3