在Python中,使用isinstance检查特定类型的异常是否合理?

10

在Python中,捕获通用异常后使用isinstance()检测特定类型的异常以便适当处理它,这样做是否合理?

目前我正在使用dnspython工具包进行测试,它有各种异常,如超时、NXDOMAIN响应等。 这些异常都是dns.exception.DNSException的子类,所以我想知道是否合理或符合Python惯例,来捕获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

这就是多个 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"

注意子句的顺序:将匹配的第一个子句放到最后,因此将超类的检查移动到最后。


谢谢Sven...看起来好多了。 - 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

如果已知异常,最好使用不同的except块进行处理。但是,最后一个except dns.resolver.DNSException是明智的,用于处理没有特定处理的子异常(或确保捕获所有dns错误)。 - Joël

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接