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 de "capture implicite" pour toutes les définitions. 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 est propagé jusqu'à l'interpréteur de base où un gestionnaire par défaut gère le problème, c'est-à-dire imprime l'exception et quitte. En d'autres termes, l'interprète dit simplement: «une exception a été soulevée et je ne sais pas comment y faire face, alors je démissionne». Ce n'est pas très différent de la façon dont la JVM ou une autre machine virtuelle gère 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-gestionnaires et dynamique vent dans le MzScheme Language Manual. En utilisant ceux-ci, vous pouvez même émuler le bloc try-catch-finally de Java.
(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 ...)))))
Cela n'a pas été ce que je cherchais. Dans Scheme, la plupart des fonctions vérifient automatiquement la division par zéro et d'autres erreurs, comment cela se produit-il? L'attraper est-il implicite dans toutes les définitions? – unj2
@kunjaan J'ai mis à jour ma réponse. –