我最近在自学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/