2012-02-11 6 views
8

¿Es razonable detectar en Python una excepción genérica y luego usar isinstance() para detectar el tipo específico de excepción a fin de manejarla adecuadamente?¿Es razonable en Python verificar un tipo específico de excepción usando isinstance?

Estoy jugando con el kit de herramientas dnspython en este momento, que tiene una serie de excepciones para cosas como un tiempo de espera, una respuesta NXDOMAIN, etc. Estas excepciones son subclases de dns.exception.DNSException, por lo que me pregunto si es razonable, o pythonic, para atrapar DNSException luego verifique una excepción específica con isinstance().

p. Ej.

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" 

Soy nuevo en Python así que se gentil!

Respuesta

16

Eso es lo except múltiples cláusulas son:

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" 

tener cuidado con el orden de las cláusulas: se tomará la primera cláusula de equivalencia, por lo que mover el cheque por la superclase hasta el final.

+0

Gracias Sven ... que se ve mucho mejor. – Vortura

1

Desde dns.resolver puede importar algunas excepciones. (código no probado)

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 con la respuesta: si se conocen las excepciones, es mejor usar diferentes bloques 'except'. Pero un último 'excepto dns.resolver.DNSException' sería acertado, para el manejo de sub-excepciones sin tratamiento específico (o para asegurarse de detectar todos los errores dns). –

Cuestiones relacionadas