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。