Question

Is it reasonable in Python to catch a generic exception, then use isinstance() to detect the specific type of exception in order to handle it appropriately?

I'm playing around with the dnspython toolkit at the moment, which has a range of exceptions for things like a timeout, an NXDOMAIN response, etc. These exceptions are subclasses of dns.exception.DNSException, so I am wondering if it's reasonable, or pythonic, to catch DNSException then check for a specific exception with isinstance().

e.g.

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"

I'm new to Python so be gentle!

Was it helpful?

Solution

That's what multiple except clauses are for:

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"

Be careful about the order of the clauses: The first matching clause will be taken, so move the check for the superclass to the end.

OTHER TIPS

From dns.resolver you can import some exceptions. (untested code)

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top