2010-07-08 13 views
8

क्या यह काम करेगा?नेस्टेड अपवाद?

try: 
    try: 
     field.value = filter(field.value, fields=self.fields, form=self, field=field) 
    except TypeError: 
     field.value = filter(field.value) 
except ValidationError, e: 
    field.errors += e.args 
    field.value = revert 
    valid = False 
    break    

अर्थात्, कि पहली लाइन ValidationError, होगा दूसरा except यह पकड़ फेंकता है तो क्या होगा?

मैंने इसे अन-नेस्टेड लिखा होगा, लेकिन दूसरा फ़िल्टर स्टेटमेंट भी असफल हो सकता है! और मैं इसे पकड़ने के लिए उसी ValidationError ब्लॉक का उपयोग करना चाहता हूं।

मैं इसे अपने आप का परीक्षण चाहते हैं, लेकिन इस कोड को तो interwoven अब यह इसे ठीक से ट्रिप हो जाने :)

एक पक्ष नोट के रूप में मुश्किल है, यह बुरा यह TypeError पकड़ने और केवल एक में उत्तीर्ण होने पर भरोसा करने के लिए है इसके बजाय तर्क? यानी जानबूझकर कुछ तर्क छोड़ रहे हैं जहां उनकी आवश्यकता नहीं है?

+2

आप यथा-स्थान कोड का परीक्षण करने की जरूरत नहीं है। एक नई पायथन लिपि बनाने के लिए यह बहुत आसान होगा, और बस एक अपवाद-उठाने वाली रेखा में चिपके रहें जहां आप उस व्यवहार का परीक्षण करना चाहते हैं। –

+0

@ आओन: आप सही हैं ... मुझे लगता है कि प्रयोग से मंच को आसान बनाना आसान था। – mpen

उत्तर

17

यदि आंतरिक प्रयास में फ़िल्टर स्टेटमेंट अपवाद उठाता है, तो पहले इसे "छोड़कर" कथन के आंतरिक सेट के खिलाफ चेक किया जाएगा और फिर यदि उनमें से कोई भी इसे पकड़ नहीं लेता है, तो इसे "बाहरी के अलावा" के बाहरी सेट के विरुद्ध चेक किया जाएगा "बयान।

आप अपने आप को समझा सकते हैं इस (यह केवल प्रिंट "मूल्य त्रुटि पकड़ा" होगा) बस कुछ इस तरह सरल करके मामला है:

try: 
    try: 
     raise ValueError('1') 
    except TypeError: 
     print 'Caught the type error' 
except ValueError: 
    print 'Caught the value error!' 

एक और उदाहरण के रूप में, यह एक मुद्रित "पकड़ा चाहिए केवल आंतरिक ValueError ":

try: 
    try: 
     raise ValueError('1') 
    except TypeError: 
     pass 
    except ValueError: 
     print 'Caught the inner ValueError!' 
except ValueError: 
    print 'Caught the outer value error!' 
+0

ओह ... अब आपने दूसरा मामला जोड़ा है। कहने वाला था ... आपको स्वीकार करने के लिए एक मिनट इंतजार करना होगा। (हाहा ... "आप इस जवाब को 0 सेकंड में स्वीकार कर सकते हैं" - क्या समय!) – mpen

+0

मुझे पहली बार "सबमिट" बटन के साथ अतिसंवेदनशील मिला ;-) –

0

ब्रेंट के जवाब तारीफ करने के लिए, और अन्य मामले का परीक्षण:

class ValidationError(Exception): pass 
def f(a): raise ValidationError() 

try: 
    try: 
     f() 
    except TypeError: 
     f(1) 
except ValidationError: 
    print 'caught1' 

try: 
    try: 
     f(1) 
    except TypeError: 
     print 'oops' 
except ValidationError: 
    print 'caught2' 
,210

कौन सा प्रिंट:

caught1 
caught2 
संबंधित मुद्दे