我有两种复制文件的方法,哪个是最柔软的/最佳版本?
在通过以对象为导向的教科书进行工作时,我被告知(在这里释义(,最好避免在出现时检查和处理"特殊情况"。我在第二版中使用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