8.2.1 condition-case

正如我们之前所看到的(see Generate an Error Message),当Emacs Lisp解释器在评估表达式时遇到问题时,它会为您提供帮助;在行话中,这被称为“发出错误信号”。通常,计算机会停止程序并显示一条消息。

然而,一些程序执行复杂的操作。它们在发生错误时不应该简单地停止。在kill-region函数中,最可能的错误是您尝试删除只读且无法删除的文本。因此,kill-region函数包含处理此情况的代码。这段代码构成了kill-region函数的主体,位于condition-case特殊形式中。

condition-case的模板如下:

(condition-case
  var
  bodyform
  error-handler…)

第二个参数,bodyform,很直观。condition-case特殊形式导致Lisp解释器评估bodyform中的代码。如果没有错误发生,特殊形式将返回代码的值并产生副作用(如果有的话)。

简而言之,condition-case表达式的bodyform部分决定一切正常时应该发生什么。

然而,如果发生错误,除了其他动作,生成错误信号的函数还将定义一个或多个错误条件名。

错误处理程序是condition-case的第三个参数。错误处理程序有两个部分,一个是condition-name,另一个是body。如果错误处理程序的condition-name部分与错误生成的条件名匹配,那么将运行错误处理程序的body部分。

正如您所期望的那样,错误处理程序的condition-name部分可以是单个条件名或条件名列表。

此外,完整的condition-case表达式可能包含多个错误处理程序。当发生错误时,将运行第一个适用的处理程序。

最后,condition-case表达式的第一个参数,var参数,有时绑定到包含有关错误的信息的变量。但是,如果该参数为nil,如在kill-region中的情况,该信息将被丢弃。

简而言之,在kill-region函数中,condition-case的代码如下:

如果没有错误,运行仅此代码
    但是,如果发生错误,运行另一段代码