首页 > 解决方案 > 如何通过装饰器在后台捕获 AttributeError?

问题描述

这正在引发 AttributeError :

from functions import *

class Class:
    def __init__(self):
        self.name = 'Name'

    @exception_handler
    def do_stuff(self):
        print('Stuff')

if __name__ == '__main__':
    test = Class()
    test.dooo_stuff()

AttributeError:“类”对象没有属性“dooo_stuff”

我想在后台使用装饰器以某种方式捕获此属性错误。这样我就可以通知用户类方法名称已更改。

所以

try:  
    test = Class()
    test.dooo_stuff()
except AttributeError:
    print('info')

将不起作用,因为那不在后台。我想更改上面的错误消息以通知用户。有没有办法做到这一点?谢谢

标签: pythonattributeerror

解决方案


Python 数据模型非常强大。您可以使用 dunder 方法自定义属性访问__getattr__

当默认属性访问失败并出现 AttributeError 时调用 [...] 此方法应返回(计算的)属性值或引发 AttributeError 异常。

虽然通常的用法是提供动态值(例如, mockdefaultdict的实现方式),但可以执行我们想要的任何代码,例如调用回调:

def handler(attribute_error_name):
    print(f"{attribute_error_name!r} does not exist")


class MyAPI:
    def do_stuff(self):
        return "done"

    def __getattr__(self, item):
        handler(item)
        return lambda: None  # if the return value is not callable, we get TypeError: 'NoneType' object is not callable

api = MyAPI()
print(api.do_stuff())
print(api.do_something_else())

输出

done
'do_something_else' does not exist
None

推荐阅读