当不知道异常的来源时,EAFP的方式是什么?

时间:2019-02-03 20:08:58

标签: python python-3.x

我是Python的新手,正试图了解Python方式®
我了解 EAFP 原理并且很喜欢,但是在该示例中如何应用

编辑:我只关心 item 没有 children 属性,而不关心dosomethingwith()内部发生了什么。
在我对EAFP的理解中,我应该像往常一样使用可能错误的语句,并捕获异常,但是由于该语句位于 for 中,因此我不得不尝试对整个块进行尝试。 / p>

try:
    for child in item.children:
        dosomethingwith( child )
except AttributeError:
    """ did the exception come from item.children or from dosomethingwith()? """  

尽管如此,看起来很像LBYL:

try:
    item.children
except AttributeError:
    """ catch it """
for child in item.children: ...

1 个答案:

答案 0 :(得分:2)

实际上,当您要访问可能不可用的资源时,可以使用EAFP。 IMO,AttributeError是一个不好的例子……

无论如何,您可以在缺少的children属性和从AttributeError函数引发的do_something_with()之间进行区分。您需要具有两个异常处理程序:

try:
    children = item.children
except AttributeError:
    print("Missing 'children' attribute")
    raise  # re-raise
else:
    for child in children:
        try:
            do_something_with(child)
        except AttributeError:
            print("raised from do_something_with()")
            raise  # re-raise

EAFP的经典示例是make_dir_if_not_exist()函数:

# LBYL 
if not os.path.exists("folder"):
    os.mkdir("folder")

# EAFP 
try:
    os.mkdir("folder")
except FileExistsError:
    pass