Python 处理简单DNS扭曲客户端上的错误
如果所有域都存在,则以下DNS异步客户端工作正常 但是,如果域名不存在,则会引发DNSNameError异常,并且不会被我的“try except”块捕获。然后,其他域将无法解析 我查看了和的文档,但没有找到如何处理此错误,因为我使用了 问题:如何在查询()中捕获DNSNameError异常 来自itertools导入周期的Python 处理简单DNS扭曲客户端上的错误,python,asynchronous,dns,twisted,Python,Asynchronous,Dns,Twisted,如果所有域都存在,则以下DNS异步客户端工作正常 但是,如果域名不存在,则会引发DNSNameError异常,并且不会被我的“try except”块捕获。然后,其他域将无法解析 我查看了和的文档,但没有找到如何处理此错误,因为我使用了 问题:如何在查询()中捕获DNSNameError异常 来自itertools导入周期的 从pprint导入pprint 从twisted.names导入客户端,dns 从twisted.internet.task导入 从twisted.internet导入延迟
从pprint导入pprint
从twisted.names导入客户端,dns
从twisted.internet.task导入
从twisted.internet导入延迟,反应器
def查询(反应器、服务器、名称):
解析程序=客户端.resolver(
resolv=“/dev/null”,服务器=[(服务器,53)],反应器=反应器)
尝试:
返回解析程序。查找地址(名称)
除:
打印“错误查询”
return defer.returnValue(([]、[]、[]))
@defer.inlineCallbacks
def干管(反应器,名称):
服务器=[“4.2.2.1”、“8.8.8.8”]
下一个服务器=循环(服务器)。下一个
结果=[]
对于名称中的n:
尝试:
results.append(查询(reactor,next_server(),n))
除:
打印“错误附加”
尝试:
结果=产生延迟。收集结果(结果)
打印“成功”
除:
打印“错误结果”
最后:
打印“关闭”
反应堆停止()
pprint(邮政编码(姓名、结果))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main(reactor,('google.com','notexist.www','google.fr',)
反应堆运行()
结果:
$ipython twisteddns.py
ipython twisteddns.py
Error result
Shutting down
[('google.com', <Deferred at 0xad862ac>),
('notexist.www',
<Deferred at 0xad8666c current result: <twisted.python.failure.Failure <class 'twisted.names.error.DNSNameError'>>>),
('google.fr', <Deferred at 0xad869ac>)]
Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
Failure: twisted.names.error.DNSNameError: <twisted.names.dns.Message instance at 0xad86a6c>
$ipython twisteddns.py
ipython twisteddns.py
误差结果
关闭
[('google.com',),
('notexist.www',
),
('google.fr',)]
延迟中未处理的错误:
未处理错误
回溯(最近一次呼叫最后一次):
失败:twisted.names.error.dnsname错误:
首先,切勿在用内联回调修饰的函数之外使用returnValue
。它没有任何意义,它会产生令人惊讶的结果,它会触发警告告诉你不要这样做,而且它可能会比Twisted的未来版本中已经损坏的更糟糕
您在query
中查找的函数是defer.success
。例如:
...
except:
print "error query"
return defer.succeed(([],[],[]))
但是,由于您没有在查询
上使用内联回调
,因此应该将其添加为errback
d = resolver.lookupAddress(name)
def queryFailed(reason):
log.err(reason, "Lookup of %s failed" % (name,))
return ([], [], [])
d.addErrback(queryFailed)
return d