سؤال

أنا مندهش من وظيفة "الخطأ" في 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

إذا لم يتم التعامل مع استثناء داخل برنامج المستخدم ، فسيتم نشره إلى المترجم الأساسي حيث يتعامل معالج الافتراضي معه ، أي طباعة الاستثناء والخروج. بمعنى آخر ، يقول المترجم الفوري فقط ، "تم إثارة استثناء ولا أعرف كيف أتعامل معه ، لذلك أنا أقيد". هذا لا يختلف كثيرًا عن كيفية استثناءات JVM أو بعض استثناءات مقبض الجهاز الظاهري.

لمعرفة المزيد حول آلية معالجة استثناءات مخطط PLT ، يرجى القراءة عن مع المعالجات و الريم الديناميكي في ال دليل اللغة مزدشيم. باستخدام هذه ، يمكنك حتى محاكاة كتلة جافا المحاولة-فونالي.

(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