在Java中LBYL对EAFP?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

最近,自学了Python,并发现了LBYL/EAFP在代码执行前的错误检查方面的习惯用法。在Python中,被接受的风格似乎是EAFP

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

提问于
用户回答回答于

可以将其看作相当于以下内容:

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

用户回答回答于

如果正在访问文件,EAFP比LBYL更可靠,因为涉及LBYL的操作不是原子操作,并且文件系统可能在您查看时间和跳跃时间之间发生变化。实际上,标准名称是TOCTOU - 检查时间,使用时间,由于不正确的检查而导致的错误是TOCTOU错误。

考虑创建一个必须具有唯一名称的临时文件。找出所选文件名是否存在的最好方法是尝试创建它 - 确保使用选项来确保如果文件已经存在(以POSIX / Unix术语,O_EXCL标志open()),则操作失败。如果您尝试测试文件是否已存在(可能使用access()),那么在表示“否”的时间与尝试创建文件的时间之间,某人或其他人可能已经创建了该文件。

扫码关注云+社区