如何PLTScheme发现错误?
-
21-09-2019 - |
题
我通过在PLTScheme“错误”功能惊讶。 如果我有一个除数为零,它没有做任何其他的递归和刚出来的调用堆栈,并给我一个错误。
是否有所有的功能之前的隐式延续?是否错误扔掉的调用堆栈?是否有人对此有什么想法?
解决方案
在PLT的计划,过程错误引发异常的 EXN:失败,它包含一个错误的字符串。没有“隐钓”的所有定义。请看下面的示例:
;; 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
如果一个异常没有用户程序中进行处理,它是其中的默认处理程序处理它,即打印异常和出口传播到核心解释。换句话说,解释只是说,“一个异常发生,我不知道如何处理它,所以我在quiting”。这不是从JVM或一些其它虚拟机如何处理异常太大的不同。
要了解更多关于PLT的计划中的异常处理机制,请阅读有关的与-处理程序和动态风的中的 MzScheme的语言手册。使用这些,你甚至可以模仿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 ...)))))
不隶属于 StackOverflow