复制文件时使用try / except或if / else

时间:2017-05-05 10:45:32

标签: python file-io try-catch race-condition

我有两种复制文件的方法,哪一个是最pythonic /最好的版本?

在研究面向对象的教科书时,我被告知(在此解释),最好避免在出现时检查和处理“异常情况”。我在第二个版本中使用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))

2 个答案:

答案 0 :(得分:2)

绝对是第二个。

很容易将您的程序步骤视为顺序操作,其间没有其他任何事情发生。但这并不是计算机(至少是现代非嵌入式计算机)的工作原理。

在检查路径存在和实际尝试写入路径之间,某些其他程序可能很容易出现并删除它导致未捕获的运行时异常。这是一个常见的并发错误。

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

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

答案 1 :(得分:2)

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

由大家说,这取决于你,但这是python文档中的内容供你参考。

<强> LBYL

  

在你跳跃之前先看看。这种编码风格在进行调用或查找之前明确地测试前置条件。这种风格与EAFP方法形成对比,其特点是存在许多if语句。

     

在多线程环境中,LBYL方法可能会冒险在“外观”和“跳跃”之间引入竞争条件。例如,代码,如果映射中的键:如果另一个线程在测试之后但在查找之前从映射中删除了键,则返回映射[key]可能会失败。这个问题可以通过锁定或使用EAFP方法来解决。

<强> EAFP

  

比获得许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。

)共有的LBYL风格形成对比

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