是否可以开发一个装饰器来确定一个函数是否成功完成而不会崩溃?像下面的装饰器一样,但它必须检测函数是否成功运行。
def functionStartDecorator():
print("Function has started")
def decoratorWrapper(functionToBeDecorated):
def wrapper(*args, **kwargs):
#Todo log function has run
return functionToBeDecorated(*args, **kwargs)
return wrapper
return decoratorWrapper
答案 0 :(得分:2)
如评论中所述,最简单的方法是将您的函数包装在try / except中。如果你的函数没有返回任何内容并且只是通过副作用操作,那么装饰函数返回该函数的运行状态应该是直截了当的:
def tryfn(f):
def decorated(*args, **kwargs):
try:
f(*args, **kwargs)
return 'Ran successfully'
except Exception as e:
return 'Error: {}'.format(e)
return decorated
然后你可以调整装饰的确切返回类型:也许返回一个布尔值,也许将函数的状态追加到f
的返回,也许记录一下......核心原则可能仍然存在装饰函数中的try/except
。例如,如果您想要返回两个返回值(如果失败则返回None
)以及这是否成功:
def tryfn(f):
def decorated(*args, **kwargs):
try:
res = f(*args, **kwargs)
return True, res
except:
return False, None
return decorated
请注意,在这种情况下,您丢失有关确切错误的信息,因此您可能希望将返回扩展为包括成功,失败,错误等...在便利性和完整性之间取得平衡,这将取决于您的确切问题。
答案 1 :(得分:0)
我做了这样的事。您是否看到此代码存在任何问题?
def functionStartDecorator():
def decoratorWrapper(functionToBeDecorated):
def wrapper(*args, **kwargs):
try:
print("Function has started")
result=functionToBeDecorated(*args, **kwargs)
print("Function has complete")
return result
except:
print ("Function failed")
return wrapper
return decoratorWrapper
@functionStartDecorator()
def simplefunc():
return "somthing"