Python错误检查标准实践

2024-05-17 12:44:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于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不存在,那么无论如何都会生成一个异常,并且异常消息的详细程度足以让用户知道该文件不存在


我只是想知道上面哪一个是我的代码应该使用的标准实践。


Tags: 文件path方法ifos先决条件existsetc
3条回答

如果您只想引发异常,请使用选项iii

def myFunction(filepath):
    with open(filepath) as infile:
        pass

要以特殊方式处理异常,请使用try...except块:

def myFunction(filepath):
    try:
        with open(filepath) as infile:
            pass
    except IOError:
        # special handling code here

在任何情况下,最好先检查文件的存在性(选项iii),因为在检查或断言发生和python尝试打开文件之间的时间段内,可能会删除或更改文件(例如使用符号链接),这可能导致错误或安全漏洞。

另外,从Python 2.6开始,打开文件时的最佳实践是使用with open(...)语法。这保证了文件将被关闭,即使在with块中发生异常。

在Python 2.5中,如果在脚本前面加上

from __future__ import with_statement

以下是~unutbu的例子。如果文件不存在,或出现任何其他类型的IO错误,则文件名也会在错误消息中传递:

path = 'blam'
try:
    with open(path) as f:
        print f.read()
except IOError as exc:
    raise IOError("%s: %s" % (path, exc.strerror))

=>;IOError:blam:没有这样的文件或目录

绝对不要使用断言。断言只有在代码错误时才会失败。不应使用断言检查外部条件(例如缺少文件)。

正如其他人所指出的,断言可以被关闭。

assert的形式语义是:

  1. 条件可能被评估,也可能不被评估(所以不要依赖于表达式的副作用)。

  2. 如果条件为true,则继续执行。

  3. 如果条件为假,将发生什么是不确定的。

More on this idea

相关问题 更多 >