我想制作一个装饰器来捕捉异常并充分记录它们。
def logger(foo):
try:
print foo()
except Exception as e:
print e
@logger
def d():
return 2/2
if __name__ == '__main__':
d()
多数民众赞成我认为,但是我运行它并且我有一个例外:
1
Traceback (most recent call last):
File "log.py", line 14, in <module>
d()
TypeError: 'NoneType' object is not callable
为什么解释器告诉我函数有None类型,但是调用它并打印答案?
答案 0 :(得分:19)
你的装饰师需要返回一个函数,但它没有返回任何东西,因此&#39; TypeError:&#39; NoneType&#39;对象不可调用&#39;。你可以这样实现它:
def logger(foo):
def fn():
try:
print foo()
except Exception as e:
print e
return fn
查看This question,了解如何编写/使用装饰器的一个很好的例子。
答案 1 :(得分:2)
logger
不会返回值。所有这些函数都可以被认为是返回None
。您尚未正确定义装饰器。看起来应该更像这样:
def logger(foo):
def _logger(foo):
try:
print foo()
except Exception as e:
print e
return _logger
...但请记住,这会丢失大量信息,捕获并吞下大量异常,并且还会吞下foo
函数的任何返回值。虽然您可能在生产代码中执行的操作与此处显示的内容不同,但重要的是装饰器函数本身必须返回一个可以调用的函数(在我的示例中为_logger
)。