2009-10-13 7 views
5

Ich bin erstaunt über die "Fehler" -Funktion in PLTScheme. Wenn ich eine Division durch Null habe, tut es keine andere Rekursion und kommt nur aus dem Call-Stack und gibt mir einen Fehler.Wie funktioniert PLTScheme Catch Fehler?

Gibt es eine implizite Fortsetzung vor allen Funktionen? Löscht der Fehler den Call Stack? Hat jemand eine Ahnung davon?

Antwort

6

In PLT Scheme, das Verfahren Fehler wirft die Ausnahme EXN: fail, die einen Fehler Zeichenfolge enthält. Es gibt keinen "impliziten Fang" für alle Definitionen. Schauen Sie sich das folgende Beispiel:

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

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

Führen Sie das Skript von der Kommandozeile und Sie werden sehen, der Dolmetscher bestehenden nach wie etwas Druck

/: division by zero 

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

Wenn eine Ausnahme nicht innerhalb des Anwenderprogramms gehandhabt wird, Es wird an den Core-Interpreter weitergegeben, wo ein Standard-Handler damit arbeitet, dh die Exception ausdrucken und beenden. Mit anderen Worten, der Dolmetscher sagt nur: "Eine Ausnahme wurde erhoben, und ich weiß nicht, wie ich damit umgehen soll, also beende ich mich". Dies unterscheidet sich nicht wesentlich davon, wie die JVM oder eine andere virtuelle Maschine Ausnahmen behandelt.

Um mehr über PLT Scheme Ausnahmebehandlung zu erfahren, wenden Sie sich bitte über mit Zufuhren lesen und dynamische Wind im MzScheme Language Manual. Mit diesen können Sie sogar den try-catch-finally-Block von Java emulieren.

(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)))))) 

Hier ist die Syntax-Erweiterung, die die oben möglich gemacht haben:

;; 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 ...))))) 
+0

Das war nicht, was ich suchte. In Scheme überprüfen die meisten Funktionen automatisch Division durch Null und andere Fehler, wie geschieht das? Ist der Fang in allen Definitionen enthalten? – unj2

+0

@kunjaan Ich habe meine Antwort aktualisiert. –