在Python中用isinstance检查特定异常是否合理?
在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"
要注意这些语句的顺序:第一个符合条件的语句会被执行,所以把对父类的检查放在最后。