Разумно ли в Python проверять определенный тип исключения с помощью isinstance? - PullRequest
10 голосов
/ 12 февраля 2012

Разумно ли в Python перехватывать универсальное исключение, а затем использовать isinstance() для обнаружения определенного типа исключения и его надлежащей обработки?

В настоящее время я работаю с инструментарием dnspython, который имеет ряд исключений для таких вещей, как тайм-аут, ответ NXDOMAIN и т. Д. Эти исключения являются подклассами dns.exception.DNSException, поэтому мне интересно, разумно ли это или pythonic, чтобы поймать 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"

Я новичок в Python, так что будьте осторожны!

Ответы [ 2 ]

20 голосов
/ 12 февраля 2012

Вот для чего нужно несколько 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"

Будьте осторожны с порядком предложений: первое соответствующее предложение будет принято, поэтому переместите проверку для суперкласса до конца.

1 голос
/ 02 декабря 2013

Из 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
...