gpt4 book ai didi

scheme - PLTScheme如何捕获错误?

转载 作者:行者123 更新时间:2023-12-04 18:54:08 25 4
gpt4 key购买 nike

我对PLTScheme中的“错误”功能感到惊讶。
如果我被零除,它将不执行任何其他递归操作,而只是退出调用堆栈,并给我一个错误。

在所有功能之前是否存在隐式延续?错误会丢弃调用堆栈吗?有人对此有任何想法吗?

最佳答案

在PLT方案中,过程错误引发异常exn:fail,其中包含错误字符串。所有定义都没有“隐式捕获”。查看以下示例:

;; test.ss
(define (a d)
(printf "~a~n" (/ 10 d)))

(a 0) ;; The interpreter will exit here.
(printf "OK~n")

从命令行执行上述脚本,在打印类似以下内容后,您将看到解释器的存在
/: division by zero

=== context ===
/home/user/test.ss:1:0: a

如果在用户程序中未处理异常,则将其传播到默认解释处理程序处理的核心解释器,即打印该异常并退出。换句话说,解释器只是说:“引发了一个异常,我不知道如何处理,所以我退出了。”这与JVM或某些其他虚拟机处理异常的方式没有太大不同。

要了解有关PLT Scheme的异常处理机制的更多信息,请在 MzScheme Language Manual中阅读有关with-handlers和dynamic-wind的信息。使用这些,您甚至可以模拟Java的try-catch-finally块。
(define (d a b)
(try
(printf "~a~n" (/ a b))
(catch (lambda (ex)
(printf "Error: ~a" ex)))
(finally
(if (> b -2)
(d a (sub1 b))))))

以下是语法扩展,使上述操作成为可能:
;; try-catch-finally on top of with-handlers and dynamic-wind.

(define-syntax try
(syntax-rules (catch finally)
((_ try-body ... (catch catch-proc))
(with-handlers (((lambda (ex) #t)
(lambda (ex)
(catch-proc ex))))
(begin
try-body ...)))
((_ try-body ... (catch catch-proc) (finally fin-body ...))
(dynamic-wind
(lambda () ())

(lambda ()
(with-handlers (((lambda (ex) #t)
(lambda (ex)
(catch-proc ex))))
(begin
try-body ...)))

(lambda () fin-body ...)))
((_ try-body ... (finally fin-body ...))
(dynamic-wind
(lambda () ())

(lambda () try-body ...)

(lambda () fin-body ...)))))

关于scheme - PLTScheme如何捕获错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557854/

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