11.7.3.2 如何处理错误

当发出一个错误时,signal 会为该错误寻找一个当前有效的 处理程序(handler)。处理程序是一段 Lisp 表达式,用于在程序的某一部分发生错误时执行。 如果该错误存在可用的处理程序,就会执行该处理程序,然后控制流在处理程序之后继续执行。处理程序在建立它的 condition-case 所在的环境中执行;在该 condition-case 内部调用过的所有函数都已经退出,处理程序无法返回到这些函数中。

如果该错误没有可用的处理程序,则会终止当前命令,并将控制权交还给编辑器命令循环。(命令循环内置了一个可处理所有类型错误的隐式处理程序。)命令循环的处理程序会利用错误符号及关联数据来打印错误消息。你可以通过变量 command-error-function 来控制这一处理过程:

Variable: command-error-function

若该变量的值为非 nil,则指定了一个用于处理 “将控制权交还 Emacs 命令循环” 类错误的函数。该函数需接收三个参数: data:格式与 condition-case 绑定到其变量的列表相同; context:描述错误发生场景的字符串,(更常见的情况是)值为 nilcaller:调用了触发该错误的基本函数的那个 Lisp 函数。

无显式处理程序的错误可能会调用 Lisp 调试器(see 调用调试器)。当变量 debug-on-error(see 发生错误时进入调试器)的值为非 nil 时,调试器会被启用。与错误处理程序不同,调试器会在错误发生的环境中运行,因此你可以精准查看错误发生时各变量的取值。在批处理模式下(see Batch Mode),Emacs 进程通常会以非零退出状态终止。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike