【问题标题】:Retrieve details from AttributeError object in Python从 Python 中的 AttributeError 对象中检索详细信息
【发布时间】:2021-01-19 16:29:29
【问题描述】:

我正在枚举列表中的一些对象,这些对象可能具有也可能不具有某些属性。如果属性不存在,我会得到AttributeError。我想要做的是捕获异常对象并检索导致错误的特定属性并将其设置为空字符串。我在AttributeError 对象中没有看到任何方法来检索所述属性。

这里有部分代码:

import wmi
c = wmi.WMI ()
for account in c.Win32_Account():
    try:
        print(f"Name: {account.Name}, FullName: {account.FullName}, LocalAccount: {account.LocalAccount}, Domain: {account.Domain}")
    except AttributeError as error:
        # How do I retreive the attribute in question from the exception object?

【问题讨论】:

    标签: python python-3.x exception


    【解决方案1】:

    根据原始帖子,您希望“检索导致错误的特定属性并将其设置为空字符串”。

    如果您只想打印字符串,请使用 getattr:

    https://docs.python.org/3/library/functions.html#getattr

    import wmi
    c = wmi.WMI ()
    for account in c.Win32_Account():
        print(f"Name: {getattr(account, 'Name', "")}, FullName: {getattr(account, 'FullName', "")}, LocalAccount: {getattr(account, 'LocalAccount', "")}, Domain: {getattr(account, 'Domain', "")}")
    

    如果您想实际覆盖缺失值,请使用 hasattr 和 setattr:

    for account in c.Win32_Account():
        for attr in ['Name', 'FullName', 'LocalAccount', 'Domain']:
            if not hasattr(account, attr):
                setattr(account, attr, "")
    

    【讨论】:

    • 这假定有一个有效的默认值来代替缺少的属性。
    • 另外,你只是忽略有一个错误。如果某个属性完全缺失,则有正当理由引发错误。
    • per OP:检索导致错误的特定属性并将其设置为空字符串
    【解决方案2】:

    每个Exception 对象都将其参数存储在.args 属性中。 AttributeError 对象的参数是一个字符串,其中包含正在使用 属性访问权限的 对象,并且 属性访问过

    这条消息的格式看起来像-

    ('|")object_name('|") object has no attribute ('|")property_name('|")
    

    其中('|") 表示“匹配双引号或单引号”

    您可以使用此正则表达式提取对象名称和属性名称-

    (?:\'|")(\w+)(?:\'|")
    

    所以最终的实现看起来像-

    import wmi
    import re
    
    c = wmi.WMI ()
    for account in c.Win32_Account():
        try:
            print(f"Name: {account.Name}, FullName: {account.FullName}, LocalAccount: {account.LocalAccount}, Domain: {account.Domain}")
        except AttributeError as error:
            property_name = re.findall(r'(?:\'|")(\w+)(?:\'|")', error.args[0])[-1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2015-05-31
      • 1970-01-01
      • 2015-08-14
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多