gpt4 book ai didi

error-handling - 常见的 lisp 重启到条件绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 06:51:13 25 4
gpt4 key购买 nike

我在空闲时间学习通用 lisp,对条件系统有疑问。

当我们在 common lisp 中处理错误时,我们在处理程序中指定错误类型以确定要处理的错误。在引发和处理错误之间,我可以进行一些重新启动(例如使用重新启动案例),但我无法在重新启动时指定错误类型。

例如,假设我有一个函数,它接受一个字符串和一个流,将字符串发送到流并从流中读取响应并返回它。假设如果我的消息是错误的,我会从流中读取错误响应。我想提出一个错误并绑定(bind)一个重新启动,要求这样的新消息:

(defun process-message (stream raw-message)
(let ((response (get-response stream raw-message)))
(restart-case
(when (response-error-p response)
(error 'message-error :text response))
(change-raw-message (msg)
(process-message stream msg)))))

现在假设消息很复杂,我得到了另一个函数 send-command在更高级别,可以从一些参数创建消息并调用过程消息。我要绑定(bind)另一个重启recreate-command-message如果 'message-error 将允许用户从参数发送新命令获得。此重新启动可能位于 process-message 的重新启动案例中。 ,但它并不完全正确,因为 process-message不应该知道像 send-command 这样的高级功能并且返回值可能不同。

但现在会抛出流错误(如 EOF 等) throw recreate-command-message如果套接字将失败 recreate-command-message一些超高层可以重启socket-error处理程序,并且此重新启动将无用且惯用错误。

这是一个程序设计问题,应该设计一个程序来避免此类问题,还是我找不到如何将重新启动绑定(bind)到错误类型或我不正确理解条件系统?

谢谢。

最佳答案

也许这会有所帮助:

(define-condition low-level-error (simple-error)
()
(:report (lambda (c s)
(format s "low level error."))))

(define-condition high-level-error (simple-error)
()
(:report (lambda (c s)
(format s "high level error."))))

(defun low-level (errorp)
(restart-case
(when errorp (error 'low-level-error))
(go-on ()
:report "go on from low-level"
t)))

(defun high-level (high-level-error-p low-level-error-p)
(restart-case
(progn
(when high-level-error-p (error 'high-level-error))
(low-level low-level-error-p))
(go-on ()
:report "go on from high level"
:test (lambda (c) (typep c 'high-level-error))
t)))

尝试使用不同的值(tnil)为其参数调用 high-level,并在相应的可用重新启动时检查调试器适合您的需求。只有在发出高级别错误信号时才会看到高级别重启,并且由于高级别的重启保持在堆栈中,因此低级别函数不必知道高级别的恢复方式。

对于您的特定用例,如果我理解正确,这将意味着:建立您的 recreate-command-message 重新启动以重新调用 process-message send-command,并使其仅适用于高级错误。

您在阅读上面链接的 PCL 章节 Vsevolod 后可能知道,实际处理这些错误,即决定调用哪个重新启动,是通过 handler-bindhandler-case

关于error-handling - 常见的 lisp 重启到条件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15470619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com