使用try/deve以外,或者在复制文件时使用



我有两种复制文件的方法,哪个是最柔软的/最佳版本?

在通过以对象为导向的教科书进行工作时,我被告知(在这里释义(,最好避免在出现时检查和处理"特殊情况"。我在第二版中使用try/except有效的方式是有效的吗?

使用if/else的第一个版本:

if os.path.exists(dest):
    print("nCopying zipfile to {}".format(dest))
    shutil.copy(self.backup_zipfile_name, dest)
else:
    print("Cannot find {}.".format(dest))

使用try/except的第二版:

try:
    shutil.copy(self.back_zipfile_name, dest)
except FileNotFoundError:
    print("{!r} could not be found".format(dest))

绝对是第二个。

很容易将您的程序步骤视为彼此之间没有其他任何事情的顺序动作。但这并不是真正的计算机(至少现代非嵌入式计算机(的工作方式。

在您检查路径是否存在并实际上试图写入其他程序之间,一些其他程序很容易出现并将其删除,从而导致未熟悉的运行时例外。这是一个常见的并发错误。

因此,始终使用try/catch(或在Python的情况下,try/except(使用文件系统,网络或任何其他您无法完全控制的外部资源时。

这是一个很好的资源,具有更深入的解释。

编辑:我认为@Jared Smiths的响应更适合该特定用例(访问文件系统(。


每个人都说,这取决于您,但这是Python文档中所说的参考。

lbyl

在跳跃之前先看一下。在拨打电话或查找之前,这种编码样式明确测试了预先条件。这种样式与EAFP方法形成鲜明对比,其特征是许多if语句的存在。

在多线程环境中,LBYL方法可能会冒着在"外观"one_answers"跳跃"之间引入种族条件的风险。例如,如果映射中的键:返回映射[键]如果另一个线程在测试后删除键,但在查找之前,代码可能会失败。可以用锁或使用EAFP方法来解决此问题。

EAFP

比许可更容易寻求宽恕。这种常见的Python编码样式假定存在有效键或属性,如果假设证明是错误的,则会发现异常。这种干净而快速的样式的特征是许多尝试和语句的存在。该技术与许多其他语言(例如c。

(共有的LBYL风格形成鲜明对比

https://docs.python.org/2/glossary.html

最新更新