在Python中用isinstance检查特定异常是否合理?

10 投票
2 回答
9059 浏览
提问于 2025-04-17 12:52

在Python中,捕获一个通用的异常,然后用 isinstance() 来检测具体的异常类型,以便更好地处理,这样做合理吗?

我现在在玩一个叫dnspython的工具包,它有很多不同的异常,比如超时、NXDOMAIN响应等等。这些异常都是 dns.exception.DNSException 的子类,所以我在想,捕获 DNSException 然后用 isinstance() 检查具体的异常,这样做是否合理,或者说是否符合Python的风格。

比如:

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 个回答

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
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"

要注意这些语句的顺序:第一个符合条件的语句会被执行,所以把对父类的检查放在最后。

撰写回答