【发布时间】:2016-12-14 14:26:41
【问题描述】:
Python 新手,我有一堆函数可以在某些硬件上执行各种任务。每个函数都有不同数量的参数和返回值。
我想制作一种通用的“重试”包装函数,它会从我的任何函数中捕获异常并进行一些错误处理(例如重试任务)。
据我了解,我应该能够将装饰器函数用作每个函数的通用包装器。这似乎可行,但我似乎无法真正从装饰器函数中调用的函数中获得任何异常。
我查看了各种示例并想出了这个:
def retry(function):
def _retry(*args, **kwargs):
try:
reply = function(*args, **kwargs)
print "reply: ", reply
return reply
except PDError as msg:
print "_retry", msg
except:
print "_retry: another error"
return _retry
然后我使用我的一个函数的名称来调用它:
value = retry(pd.command_get_parameter(0x00))
它似乎调用了我的函数并正确返回,但我的重试函数中从未捕获到异常。所以我无法处理错误并重试。
我也试过这个:
from functools import wraps
def retry(function):
@wraps(function)
def _retry(*args, **kwargs):
.....
我不确定我做错了什么,或者这是否是最好的方法。有人对如何做到这一点有建议吗?我真的不想为我的每个主要功能分别创建“重试”功能。
【问题讨论】:
-
您的意思是
retry(pd.command_get_parameter)(0x00)?现在您将pd.command_get_parameter(0x00)的结果作为function传递给retry。 -
@Will:你应该像这样使用:
@retry def command_get_parameter(..)。您还可以传入retry(command_get_parameter)之类的函数,并在其位置使用返回的函数。你没有做它们中的任何一个。您正在从command_get_parameter(..)传递返回值以重试 - 您应该在其中传递一个函数。 -
@Ryan:谢谢。现在你已经解释过了,我可以明白为什么它在我传递结果时不起作用。
标签: python python-2.7 exception decorator