查看源码 erl_error 行为 (stdlib v6.2)
此模块提供用于美观打印错误和异常的函数。它被 shell
和 proc_lib
用来打印异常。
引发错误的模块可以通过使用额外的错误信息调用 error/3
来提供额外的信息。有关此机制的更多详细信息,请参阅 EEP-54。
回调函数
以下函数将从错误信息处理程序中导出。
摘要
类型
起始列号。默认值为 1。
用于格式化 BIF 和函数调用的函数参数的函数。默认情况下,将使用以下函数
包含格式化选项的映射。
用于修剪堆栈跟踪末尾的函数。它使用堆栈跟踪中的条目的模块、函数和 arity 调用。如果该条目应被修剪,则该函数应返回 true
,否则返回 false
。默认值为
回调
当 format_exception/4
或类似功能想要提供有关错误的额外信息时,将调用此回调。调用的 Module
:Function
是由 error_info
映射指定的。
函数
以与 shell 格式化它们的方式相同的样式,格式化使用 try
... catch
捕获的错误原因和堆栈回溯。
类型
-type column() :: pos_integer().
起始列号。默认值为 1。
用于格式化 BIF 和函数调用的函数参数的函数。默认情况下,将使用以下函数
fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
-type format_options() :: #{column => column(), stack_trim_fun => stack_trim_fun(), format_fun => format_fun()}.
包含格式化选项的映射。
用于修剪堆栈跟踪末尾的函数。它使用堆栈跟踪中的条目的模块、函数和 arity 调用。如果该条目应被修剪,则该函数应返回 true
,否则返回 false
。默认值为
fun(_, _, _) -> false end
回调
-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
函数
-spec format_exception(Class, Reason, StackTrace) -> unicode:chardata() when Class :: error | exit | throw, Reason :: term(), StackTrace :: erlang:stacktrace().
等效于 format_exception/4
。
-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
。