2012-02-11 6 views
8

क्या पाइथन में सामान्य अपवाद पकड़ने के लिए उचित है, तो उचित तरीके से इसे संभालने के लिए विशिष्ट प्रकार के अपवाद का पता लगाने के लिए isinstance() का उपयोग करें?क्या इंस्टीटेंस का उपयोग करके एक विशिष्ट प्रकार के अपवाद की जांच करने के लिए पायथन में उचित है?

मैं इस समय dnspython टूलकिट के साथ खेल रहा हूं, जिसमें टाइमआउट, एनएक्सडीओएन प्रतिक्रिया आदि जैसी चीजों के लिए अपवाद हैं। ये अपवाद dns.exception.DNSException के उप-वर्ग हैं, इसलिए मुझे आश्चर्य है कि यह उचित है, या पाइथोनिक, DNSException पकड़ने के लिए isinstance() के साथ एक विशिष्ट अपवाद की जांच करें।

उदा।

try: 
    answers = dns.resolver.query(args.host) 
except dns.exception.DNSException as e: 
    if isinstance(e, dns.resolver.NXDOMAIN): 
     print "No such domain %s" % args.host 
    elif isinstance(e, dns.resolver.Timeout): 
     print "Timed out while resolving %s" % args.host 
    else: 
     print "Unhandled exception" 

मैं पाइथन के लिए नया हूं इसलिए नम्र रहो!

उत्तर

16

है यही कारण है कि कई except खंड के लिए कर रहे हैं:

try: 
    answers = dns.resolver.query(args.host) 
except dns.resolver.NXDOMAIN: 
    print "No such domain %s" % args.host 
except dns.resolver.Timeout: 
    print "Timed out while resolving %s" % args.host 
except dns.exception.DNSException: 
    print "Unhandled exception" 

खंड के आदेश के बारे में सावधान रहें: मेल खाने वाले प्रथम खंड ले जाया जाएगा, तो अंत करने के लिए सुपर-क्लास के लिए चेक चलते हैं।

+0

धन्यवाद स्वेन ... जो बहुत अच्छा दिखता है। उत्तर के साथ – Vortura

1

dns.resolver से आप कुछ अपवाद आयात कर सकते हैं। (अनचाहे कोड)

from dns.resolver import Resolver, NXDOMAIN, NoNameservers, Timeout, NoAnswer 

try 
    host_record = self.resolver.query(self.host, "A") 
    if len(host_record) > 0: 
     Mylist['ERROR'] = False 
     # Do something 

except NXDOMAIN: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = NXDOMAIN 
except NoNameservers: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = NoNameservers 
except Timeout: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = Timeout 
except NameError: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = NameError 
+0

+1: यदि अपवाद ज्ञात हैं, तो विभिन्न 'सिवाय' ब्लॉक का उपयोग करना बेहतर है। लेकिन अंतिम उपचार के बिना उप-अपवादों को संभालने के लिए (या सभी डीएनएस त्रुटियों को पकड़ने के लिए सुनिश्चित करने के लिए) dns.resolver.DNSException को छोड़कर अंतिम 'बुद्धिमान होगा। –

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