Question

Je suis étonné par la fonction « d'erreur » dans PLTScheme. Si j'ai une division par zéro, il ne marche pas tout autre récursivité et vient juste de sortir de la pile d'appel et de me donner une erreur.

Y at-il une continuité implicite avant toutes les fonctions? L'erreur se jeter la pile d'appel? Est-ce que quelqu'un a une idée à ce sujet?

Était-ce utile?

La solution

Dans le schéma de PLT, la procédure erreur soulève l'exception exn: fail , qui contient une chaîne d'erreur. Il n'y a pas « attraper implicite » pour tous les définit. Regardez l'exemple suivant:

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

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

Exécuter le script ci-dessus de la ligne de commande et vous verrez l'interpréteur existant après l'impression quelque chose comme

/: division by zero

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

Si une exception est pas gérée dans le programme utilisateur, il se propage à l'interpréteur de base où un gestionnaire par défaut traite avec lui, i.e. imprimer l'exception et la sortie. En d'autres termes, l'interprète dit simplement, « une exception a été soulevée et je ne sais pas comment y faire face, donc je suis Quiting ». Ce n'est pas très différent de la façon dont la machine virtuelle Java ou d'une autre machine virtuelle gérer les exceptions.

Pour en savoir plus sur le mécanisme de gestion des exceptions du PLT Scheme, s'il vous plaît lire sur avec manieurs et -vent dynamique Langue MzScheme Manuel . En utilisant ces derniers, vous pouvez même imiter try-catch-finally Java bloc.

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

Voici l'extension de la syntaxe qui a fait ci-dessus possible:

;; 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 ...)))))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top