仅捕获本地AttributeError(在检查方法是否存在并调用它时)

时间:2014-11-17 11:48:51

标签: python exception

在后续调用该方法的过程中,仅针对缺失方法捕获AttributeError的最“pythonic”方法是什么,而不是AttributeError?我有这个代码,它试图调用一个方法,并在缺少方法或一些预期的异常时提供一些操作:

def foo(unknown_object):
    try:
        unknown_object.do_something()
    except SomeSpecificError:
        # the method existed, but failed in some expected way
    except AttributeError:
        # do something else ...

这也有问题AttributeError正在运行do_something(),例如编程错误(拼写错误的某些属性)。这对于调试来说显然不是很好,捕获太多可能本身就是一个bug。我可以把它改写成:

def foo(unknown_object):
    try:
        method=unknown_object.do_something
    except AttributeError:
        # do something else ...
    else:
        try:
            method()
        except SomeSpecificError:
            # the method existed, but failed in some expected way

但是这个嵌套解决方案是避免捕获太多AttributeError的最pythonic方法吗?

注意:该方法缺失或可调用(或者是编程错误,应该引发未捕获的异常),因此我不需要检查调用能力。

1 个答案:

答案 0 :(得分:0)

如果你真的想检查特定的东西,那么你可以使用hasattr和callable方法

if hasattr(unknown_object, "do_something") and callable(unknown_object.do_something):
    unknown_object.do_something()