我通过在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 ...)))))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top