在elisp中捕获错误案例的最佳方法是什么

sts*_*uad 5 emacs elisp

我正在尝试增加etags-select函数,这样如果点上的find-tag失败,它将回退到正常的find-tag.我试过的代码是:

(defun my-etags-find-tag ()
  "Find at point or fall back"
  (interactive)
  (unless (etags-select-find-tag-at-point)
    (etags-select-find-tag)))

(global-set-key (kbd "C-f") 'my-etags-find-tag)
Run Code Online (Sandbox Code Playgroud)

但是,当point不在有效标记时,这会失败.相反,我得到etags-select-find-tag-at-point抛出的错误:

etags-select-find-tag-at-point: Wrong type argument: char-or-string-p, nil
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只需要重复etags-select-find-tag-at-point完成的测试:

(defun my-etags-find-tag ()
  "Find at point or fall back"
  (interactive)
  (if (find-tag-default)
      (etags-select-find-tag-at-point)
    (etags-select-find-tag)))
Run Code Online (Sandbox Code Playgroud)

但它似乎有点多余.是否可以捕获异常并在elisp中执行备用处理?

hua*_*uan 11

尝试ignore-errors; 例如,

(unless (ignore-errors (etags-select-find-tag-at-point))
  (etags-select-find-tag))
Run Code Online (Sandbox Code Playgroud)

通常,(ignore-errors body)返回任何body回报; 当出现错误时,它会返回nil.

另请参阅condition-case更一般的条件处理.

如果您安装了Elisp信息手册,则可以从中获取更多详细信息 C-hSignore-errors.

编辑:

我没有考虑到函数可能在成功时返回nil的可能性; 所以我们可能需要

(unless (ignore-errors (or (etags-select-find-tag-at-point) t))
  (etags-select-find-tag))
Run Code Online (Sandbox Code Playgroud)