2012-02-11 25 views
8

Genel bir özel durum yakalamak için Python'da mantıklı mıdır, daha sonra uygun şekilde ele almak için belirli bir özel durum türünü algılamak için isinstance() kullanın?Python'da isinstance kullanarak belirli bir özel durum olup olmadığını kontrol etmek mantıklı mıdır?

Şu anda bir zaman aşımı, bir NXDOMAIN yanıtı, vb. Gibi durumlar için bir dizi özelliğe sahip olan dnspython araç setiyle uğraşıyorum. Bu istisnalar dns.exception.DNSException alt sınıflarıdır, bu yüzden mantıklı olup olmadığını merak ediyorum. veya pythonic, DNSException'u yakalamak için isinstance() ile özel bir istisna olup olmadığını kontrol edin.

örn.

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" 

Python'a yeni geliyorum, nazik ol!

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" 

maddeleri sırasına konusunda dikkatli olun: ilk eşleşen fıkra alınacaktır, bu nedenle sonuna kadar üst sınıfı için onay hareket için birden except hükümler vardır ne

cevap

16

.

+0

Teşekkürler Sven ... bu çok daha hoş görünüyor. – Vortura

1

dns.resolver adresinden bazı özel durumları alabilirsiniz. (test edilmemiş kod)

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 cevabı ile: istisnalar biliniyorsa, farklı 'except' bloklarını kullanmak daha iyidir. Ama son bir 'dns.resolver.DNSException hariç ', özel bir tedavi olmadan alt istisnaların ele alınması için (ya da tüm dns hatalarını yakaladığınızdan emin olmak için) akıllıca olacaktır. –