查看源代码 error_handler (内核 v10.2)
默认系统错误处理程序。
此模块定义了发生某些类型错误时会发生的情况。
您可以通过调用 erlang:process_flag(error_handler, NewErrorHandler)
来更改进程的错误处理程序。
注释
error_handler
中的代码很复杂。在完全理解错误处理程序、代码服务器的 init
进程以及代码的 I/O 机制之间的交互之前,请勿更改它。
看似很小的代码更改都可能导致死锁,因为可能会发生无法预料的后果。在这种类型的代码中使用 input
是危险的。
概要
函数
引发带有堆栈跟踪的 undef
异常,指示 Module:Function/N
未定义。
如果调用 Module:Function(Arg1,.., ArgN)
并且 Module:Function/N
未定义,则运行时系统会调用此函数。请注意,此函数在进行原始调用的进程内部求值。
如果调用 Fun(Arg1,.., ArgN)
,而定义 fun 的模块未加载,则会求值此函数。该函数在进行原始调用的进程内部求值。
函数
-spec raise_undef_exception(Module, Function, Args) -> no_return() when Module :: atom(), Function :: atom(), Args :: list().
引发带有堆栈跟踪的 undef
异常,指示 Module:Function/N
未定义。
-spec undefined_function(Module, Function, Args) -> any() when Module :: atom(), Function :: atom(), Args :: list().
如果调用 Module:Function(Arg1,.., ArgN)
并且 Module:Function/N
未定义,则运行时系统会调用此函数。请注意,此函数在进行原始调用的进程内部求值。
此函数首先尝试自动加载 Module
。如果不可能,则会引发 undef
异常。
如果可以加载 Module
并且导出了函数 Function/N
,则会调用它。
否则,如果导出函数 '$handle_undefined_function'/2
,则会将其作为 '$handle_undefined_function'(
Function, Args) 调用。
警告
强烈不建议在普通应用程序代码中定义
'$handle_undefined_function'/2
。很容易犯下细微的错误,这些错误可能需要很长时间才能调试。此外,用于静态代码分析的所有工具(例如 Dialyzer 和 Xref)都不支持使用'$handle_undefined_function'/2
,也不会添加此类支持。仅在仔细考虑其他不那么危险的解决方案后才使用此函数。一个潜在的合法用途示例是在测试和调试期间为其他子系统创建存根。
否则,将引发 undef
异常。
-spec undefined_lambda(Module, Fun, Args) -> term() when Module :: atom(), Fun :: fun(), Args :: list().
如果调用 Fun(Arg1,.., ArgN)
,而定义 fun 的模块未加载,则会求值此函数。该函数在进行原始调用的进程内部求值。
如果 Module
被解释,则会调用解释器,并返回已解释的 Fun(Arg1,.., ArgN)
调用的返回值。
否则,如果可能,则在尝试自动加载 Module
后,返回 apply(Fun, Args)
的值。如果不可能,则调用将失败,退出原因为 undef
。