我有一个关于Python中的错误检查的问题。假设我有一个函数,它以文件路径作为输入:
def myFunction(filepath):
infile = open(filepath)
#etc etc...
一个可能的先决条件是文件应该存在。
有几种可能的方法来检查这个先决条件,我只是想知道什么是最好的方法。
i)用if语句检查:
if not os.path.exists(filepath):
raise IOException('File does not exist: %s' % filepath)
这是我通常会做的方式,尽管如果文件不存在,即使我没有引发,Python也会引发相同的IOException。
ii)使用assert检查前提条件:
assert os.path.exists(filepath), 'File does not exist: %s' % filepath
使用断言似乎是检查前/后条件的“标准”方法,因此我很想使用这些方法。但是,当在执行期间使用-o标志时,这些断言可能被关闭,这意味着此检查可能被关闭,这看起来很危险。
iii)根本不处理先决条件
这是因为如果filepath不存在,那么无论如何都会生成一个异常,并且异常消息的详细程度足以让用户知道该文件不存在
我只是想知道上面哪一个是我的代码应该使用的标准实践。
如果您只想引发异常,请使用选项
iii
:要以特殊方式处理异常,请使用
try...except
块:在任何情况下,最好先检查文件的存在性(选项
i
或ii
),因为在检查或断言发生和python尝试打开文件之间的时间段内,可能会删除或更改文件(例如使用符号链接),这可能导致错误或安全漏洞。另外,从Python 2.6开始,打开文件时的最佳实践是使用
with open(...)
语法。这保证了文件将被关闭,即使在with
块中发生异常。在Python 2.5中,如果在脚本前面加上
以下是~unutbu的例子。如果文件不存在,或出现任何其他类型的IO错误,则文件名也会在错误消息中传递:
=>;IOError:blam:没有这样的文件或目录
绝对不要使用断言。断言只有在代码错误时才会失败。不应使用断言检查外部条件(例如缺少文件)。
正如其他人所指出的,断言可以被关闭。
assert的形式语义是:
条件可能被评估,也可能不被评估(所以不要依赖于表达式的副作用)。
如果条件为true,则继续执行。
如果条件为假,将发生什么是不确定的。
More on this idea。
相关问题 更多 >
编程相关推荐