我最近在自学Python,并发现了有关代码执行之前的错误检查的LBYL/EAFP习惯用法。在Python中,似乎可接受的样式是EAFP,并且似乎与该语言配合良好。

LBYL( L ook B efore Y ou L eap):

def safe_divide_1(x, y):
    if y == 0:
        print "Divide-by-0 attempt detected"
        return None
    else:
        return x/y

EAFP(相对于 P 发射,它是 sk F 的原始性 E )
def safe_divide_2(x, y):
    try:
        return x/y
    except ZeroDivisionError:
        print "Divide-by-0 attempt detected"
        return None

我的问题是:我什至从未听说过使用EAFP作为主要的数据验证结构,它来自Java和C++背景。 EAFP是在Java中明智使用的东西吗?还是异常产生了太多开销?我知道只有在实际抛出异常时才有开销,因此我不确定为什么不使用更简单的EAFP方法。只是偏爱吗?

最佳答案

就个人而言,我认为这是按惯例进行支持的,EAFP绝不是一个好方法。
您可以将其视为等同于以下内容:

if (o != null)
    o.doSomething();
else
    // handle

相对于:
try {
    o.doSomething()
}
catch (NullPointerException npe) {
    // handle
}

此外,请考虑以下事项:
if (a != null)
    if (b != null)
        if (c != null)
            a.getB().getC().doSomething();
        else
            // handle c null
    else
        // handle b null
else
    // handle a null

这看起来可能不太优雅(是的,这是一个粗糙的示例-忍受),但是与处理所有错误而不是将它们包装在try-catch中以获取NullPointerException相比,它为您提供了更大的粒度来处理错误,并且然后尝试弄清楚在哪里以及为什么得到它。

我的查看方式EAFP绝不应该使用,除非极少数情况。另外,由于您提出了以下问题:是,即使未引发异常,try-catch块也确实会产生一些开销

关于java - LBYL和EAFP在Java中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/404795/

10-10 22:43