2009-10-13 20 views
5

मैं PLTScheme में "त्रुटि" फ़ंक्शन से आश्चर्यचकित हूं। यदि मेरे पास शून्य से विभाजन है, तो यह कोई अन्य रिकर्सन नहीं करता है और केवल कॉल स्टैक से बाहर आता है और मुझे एक त्रुटि देता है।PLTScheme कैच त्रुटियों को कैसे करता है?

क्या सभी कार्यों से पहले कोई निहित निरंतरता है? क्या त्रुटि कॉल स्टैक को फेंक देती है? क्या किसी के बारे में कोई विचार है?

उत्तर

6

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 योजना के अपवाद संचालन तंत्र के बारे में अधिक जानकारी के लिए कृपया के साथ-संचालकोंके बारे में और गतिशील-हवाMzScheme Language Manual में पढ़ें। इनका उपयोग करके, आप जावा के प्रयास-अंत-अंत ब्लॉक को भी अनुकरण कर सकते हैं।

;; 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

यह वही नहीं कर रहा था मैं खोज रहा था:

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

यहाँ वाक्यविन्यास विस्तार संभव है कि इसके बाद के संस्करण बनाया है। योजना में, कार्यों का सबसे स्वचालित रूप से शून्य और अन्य त्रुटियों से विभाजन की जांच, कैसे है कि होता है? क्या सभी परिभाषित करने में आकर्षक अंतर्निहित है? – unj2

+0

@kunjaan मैं अपने जवाब को अद्यतन किया है। –