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
的代码如下:
如果没有错误,运行仅此代码 但是,如果发生错误,运行另一段代码。