Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅在特定属性上捕获AttributeError_Python - Fatal编程技术网

Python 仅在特定属性上捕获AttributeError

Python 仅在特定属性上捕获AttributeError,python,Python,是否有方法仅捕获特定属性的属性错误 e、 g.如果foo没有bar属性,我希望此代码通过,但是如果它没有baz属性,则抛出AttributeError异常 try: a = foo.bar + foo.baz except AttributeError: pass 我会写 if hasattr(foo, 'bar'): a = foo.bar + foo.baz 但是我想…首先,像所有的编码禅语句一样,宽恕与允许原则不是绝对的。特别是在这种情况下,您可以肯定地知道,在t

是否有方法仅捕获特定属性的
属性错误

e、 g.如果
foo
没有
bar
属性,我希望此代码通过,但是如果它没有
baz
属性,则抛出
AttributeError
异常

try:
   a = foo.bar + foo.baz
except AttributeError:
    pass
我会写

if hasattr(foo, 'bar'):
    a = foo.bar + foo.baz

但是我想…

首先,像所有的编码禅语句一样,宽恕与允许原则不是绝对的。特别是在这种情况下,您可以肯定地知道,在
try/except
块内发生的第一件事是提升
AttributeError
,但是您可能会发现自己处于这样的情况,即在额外的操作之后提升
AttributeError

def some_function(foo):
    costly_operation()
    insert_something_to_a_database(foo)
    return foo.bar + foo.baz

try:
    some_function(foo)
except AttributeError:
    # All the work done was not needed and it may even have
    # left traces (like the db insert) that now need to be undone.
在这些情况下,在执行任何操作之前检查权限比执行不必要的操作甚至事后尝试修复混乱更简单、更安全、更可读、更高效

不管怎么说,如果你真的需要请求原谅而不是允许,你可以在事后简单地检查一下是否允许:你假设一切都是对的,然后继续,如果有错误,你就知道这是不是你想要提出的

try:
   some_function(foo)
except AttributeError:
    if not hasattr(foo, 'bar'):
        raise

try
块中移动您不想捕捉其异常的属性访问

x = foo.baz
try:
    a = foo.bar + x
except AttributeError:
    pass

foo.bar=…
将创建属性
bar
,如果该属性不存在。唯一的错误是
foo
以某种方式不允许在初始化后创建属性。换句话说,这已经完成了您要求它执行的操作。您的选择意味着您不希望对不存在的
bar
属性使用
AttributeError
,但是如果
bar
已经存在,则会出现其他一些错误。@usr2564301在执行代码之前使用一个条件是请求权限……如果您对
类型(foo)
有控制权,则可以覆盖
\uu getattr\uuuuu
bar引发不同的异常(尽管仍然是
AttributeError
的子类),并且只捕获该异常,而不是所有的
AttributeError
s。