我正在编写一个Python函数,它从在线源获取数据并将其复制到本地数据转储中。如果已经有文件出现在指定路径上,用于上述数据转储,我希望我的程序突然停止,给用户一条短消息--我只是在构建一个小型CLI类型的程序--解释为什么他或她将要尝试的东西会破坏有价值的数据。
在上述情况下,是否应该引发FileExists错误?如果是这样的话,我想我的代码应该如下所示:
def make_data_dump():
if os.path.exists("path/to/dump"):
raise FileExistsError("Must not overwrite dump at path/to/dump.")
data = get_data_from_url()
write_to_path(data, "path/to/dump")如果这是一个愚蠢的问题,我很抱歉,但我找不到任何关于何时手动引发FileExistsError的指导,只有当程序意外地引发这样的异常时,该怎么办?因此,我问是否手动引发该异常是一个好做法。
发布于 2021-11-22 23:19:11
根据NobbyNobbs上面的评论:如果程序员在他的代码中提出了标准异常,那么在错误处理期间,如果在应用程序或系统级别上出现了给定的异常,就很难计算出。因此,这是一种最好避免的做法。
发布于 2022-03-19 08:54:32
Python 文档显式地声明这是允许的:
用户代码可以引发内置异常。这可以用于测试异常处理程序或报告错误条件,“就像”解释器引发相同异常的情况一样;但请注意,没有什么可以防止用户代码引发不适当的错误。
但是,由于不同的原因,您的代码示例是错误的。这段代码的问题在于它使用的是LBYL (在跳跃式前看)模式,它可能读取竞争条件。(在检查文件是否存在和写入文件之间,另一个进程可能已经创建了该文件,该文件现在将被覆盖)。这类场景的一个更好的模式是EAFP (请求原谅比请求许可更容易)模式。有关更多信息和示例,请参见Python中的EAFP原则是什么?。
尽管如此,我认为对于大多数Python代码来说,手动引发FileExistsError并不常见,因为您将使用已经在必要时抛出此错误的标准Python库。但是,我能想到的一个合理的原因是,何时您会为一个低级函数编写一个包装器(用另一种语言实现,比如C),并希望将错误转换为Python。
一个假设的代码示例演示了这一点:
def make_data_dump():
data = get_data_from_url()
# Assuming write_to_path() is a function in a C library, which returns an error code.
error = write_to_path(data, "path/to/dump")
if error == EEXIST:
raise FileExistsError("Must not overwrite dump at path/to/dump.")请注意,其他一些内置异常更常见于手动引发,例如,在实现迭代器时使用StopIteration,或者在实现ValueError时,例如当您的方法获得带有错误值(示例)的参数时。有些异常您很少使用自己,例如SyntaxError。
https://stackoverflow.com/questions/66606131
复制相似问题