【发布时间】:2013-02-25 23:53:21
【问题描述】:
我想检查 (forward-sexp 1) 是成功还是以错误结束。
问题是它返回 nil,即使它已经成功。如何进行此项检查?
【问题讨论】:
我想检查 (forward-sexp 1) 是成功还是以错误结束。
问题是它返回 nil,即使它已经成功。如何进行此项检查?
【问题讨论】:
改用scan-sexps。
它是forward-sexp 背后的主力,并返回一个有意义的值。
当然,如果括号不平衡,那么你会得到一个错误 - 所以你需要ignore-errors 或condition-case。
【讨论】:
forward-sexp 如果不能向前移动点,则会发出错误信号。如果你愿意,你可以用condition-case 来捕捉它。这是一个测试它的示例命令:
(defun test-forward-sexp ()
"simple command testing (forward-sexp 1)"
(interactive)
(condition-case nil
(progn
(forward-sexp 1)
(message "succeeded"))
(error (message "failed"))))
您可以在信息页面Writing Code to Handle Errors 上阅读有关处理错误的更多信息。
【讨论】:
condition-case,就是)!
(forward-sexp) 给出 nil 的问题:scan 如果有效则给出一个值,而 forward-sexp 在有效时给出 nil。您的方式是如何进行错误测试的更通用方法。他们是不同的问题?直接的答案是使用scan-sexps(避免nil),间接的答案是在出现错误时更适当地处理,这样也可以解决这个问题?
forward-sexp 和检测错误——而不是如何编写代码来移动sexp。我认为接受的答案很棒。我只反对您的评论,即我的回答不是对问题的直接回答。
forward-sexp 在出现错误时不会返回 nil(实际上在这种情况下它不会返回任何内容;它会发出错误信号)。
【讨论】:
t 或nil 返回,我们可以在错误情况下使用(ignore-errors FUN) 获得nil。很抱歉造成混乱。
(ignore-errors (forward-sexp 1) t)得到你想要的。