[英]What's wrong with this python decorator?
我有以下装饰器,应处理“无网络”异常:
class NetworkError(RuntimeError):
pass
def reTryer(max_retries=5, timeout=5):
def wraper(func):
request_exceptions = (
requests.exceptions.Timeout,
requests.exceptions.ConnectionError,
requests.exceptions.HTTPError
)
def inner(*args, **kwargs):
for i in range(max_retries):
try:
result = func(*args, **kwargs)
except request_exceptions:
time.sleep(timeout)
print("Bad or broken connection, trying again...")
continue
else:
return result
else:
raise NetworkError
return inner
return wraper
但是它根本不起作用,当我的LAN适配器处于断开状态时,甚至没有“连接不良或断开,请重试...”输出,它什么也没显示。 这是func的定义和调用:
@reTryer(5,5)
def func(arg):
#some code
func(arg)
我想念什么吗?
要回答您的问题:
由于实现似乎是正确的,所以我可以想象一些可能导致问题的原因。
我主要想到的是装饰函数永远不会返回,抛出与您关注的异常不同的异常,甚至不会返回正常。
你可以用
@reTryer(2, 1.0)
def always_ok():
print "ok"
@reTryer(2, 1.0)
def always_good_error():
print "good error"
raise requests.exceptions.Timeout
@reTryer(2, 1.0)
def always_bad_error():
print "bad error"
raise RuntimeError
我懂了
>>> always_ok()
ok
>>> import time
>>> always_good_error()
good error
Bad or broken connection, trying again...
good error
Bad or broken connection, trying again...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 17, in inner
__main__.NetworkError
>>> always_bad_error()
bad error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in inner
File "<stdin>", line 4, in always_bad_error
RuntimeError
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.