Python异常和流控制:究竟是什么;意料之外的;? 我听说在流控制中使用“try-except”是需要避免的,而异常应该只用于意外情况,因此显然不鼓励使用[Code A],而应该使用[Code B]。我理解对了吗
关于异常的最常见解释是通过文件操作完成的,因此我也将通过文件处理完成:Python异常和流控制:究竟是什么;意料之外的;? 我听说在流控制中使用“try-except”是需要避免的,而异常应该只用于意外情况,因此显然不鼓励使用[Code A],而应该使用[Code B]。我理解对了吗,python,Python,关于异常的最常见解释是通过文件操作完成的,因此我也将通过文件处理完成: from pathlib import Path my_file_path = Path("./something.txt") #### # Code A : This is a bad practice #### try : content = open (my_file_path, 'r').read() except FileNotFoundError as e : content
from pathlib import Path
my_file_path = Path("./something.txt")
####
# Code A : This is a bad practice
####
try :
content = open (my_file_path, 'r').read()
except FileNotFoundError as e :
content = ""
create_file(my_file_path)
然而,我的困惑是,如果我的程序期望我的文件路径存在,但在一些罕见的情况下可能会发生异常,比如服务器崩溃,或者说从主服务器取消同步,该怎么办
我的假设是“可能文件在第一次运行时不存在,所以文件不存在是一个预期的流”应该转到if-else语句,因为我不应该控制有异常的流
因此,我的问题2是:
这里相当混乱,或者我只是误解了异常的使用?异常的使用与其说是“意外”错误,不如说是针对偏离正常执行流程的错误 此外,捕获代码调用的代码上的异常也有效,因此它允许您更轻松地捕获代码中未生成的错误,并防止您必须知道内部代码如何工作,并且仍然能够处理问题,即异常 这两者之间有许多不同之处:
if my_path.is_file():
with open(str(my_path)) as f:
success()
else:
problem()
这是:
try:
with open(str(my_path)) as f:
success()
except FileNotFoundError:
problem()
在第一种情况下,当您检查该文件是否存在时,它可能存在,但无法保证在您实际打开它时它仍然存在。为了完全安全,您仍然需要捕获该异常
在这种情况下,这是不可能的,但是如果open()
有复杂的行为,那么引发异常的原因可能不是.is\u file()
捕获的
如果您正在检查许多不同的有问题的结果,那么捕获相关的异常是一种相当干净的方法。如果您没有在这个级别处理特定的异常,一些调用您的代码的代码可能会在稍后的阶段处理它
当然,这并不是说if
语句永远都不是流控制的好结构,但在本例中,代码的成功取决于没有直接和完全控制的I/O,在这种情况下,异常几乎总是更好的选择(即使您也使用了if
,您也必须使用它们)
有些人会指出异常的代价,但请注意,如果不引发异常,Python中的异常块是非常便宜的(并且您希望大多数情况下不会出现异常)-如果您希望尝试打开的大多数文件都不存在,这可能是首先检查的原因。使用异常与其说是“意外”错误,不如说是用于偏离正常执行流程的错误 此外,捕获代码调用的代码上的异常也有效,因此它允许您更轻松地捕获代码中未生成的错误,并防止您必须知道内部代码如何工作,并且仍然能够处理问题,即异常 这两者之间有许多不同之处:
if my_path.is_file():
with open(str(my_path)) as f:
success()
else:
problem()
这是:
try:
with open(str(my_path)) as f:
success()
except FileNotFoundError:
problem()
在第一种情况下,当您检查该文件是否存在时,它可能存在,但无法保证在您实际打开它时它仍然存在。为了完全安全,您仍然需要捕获该异常
在这种情况下,这是不可能的,但是如果open()
有复杂的行为,那么引发异常的原因可能不是.is\u file()
捕获的
如果您正在检查许多不同的有问题的结果,那么捕获相关的异常是一种相当干净的方法。如果您不在这个级别处理特定的异常,一些调用您的代码的代码可能会在稍后的阶段处理它
当然,这并不是说if
语句永远都不是流控制的好结构,但在本例中,代码的成功取决于没有直接和完全控制的I/O,在这种情况下,异常几乎总是更好的选择(即使您也使用了if
,您也必须使用它们)
有些人会指出异常的代价,但请注意,如果不引发异常(而且大多数情况下,您可能不会想到),Python中的异常块非常便宜-如果您希望尝试打开的大多数文件都不存在,这可能是一个先检查的原因。请尝试尝试,但这些问题除外。 作为:- 它将尝试try块,如果不能,它将转到except块并运行给定的东西。因此,它不会因为错误而停止运行代码 你可以用
except:
要获取所有错误,它不会停止整个程序的运行。请尝试使用Try,但这些问题除外。 作为:- 它将尝试try块,如果不能,它将转到except块并运行给定的东西。因此,它不会因为错误而停止运行代码 你可以用
except:
要获取所有错误,它不会停止运行整个程序。如果完全错误,则使用
。这会使您的程序易受竞争条件的影响,即使您自己准备了文件!要使您的问题得到正确回答,您可能需要给出此建议的来源。显然,只有在n你期待它们。很多“不要对X使用异常处理”是愚蠢的。在你的情况下,这正是你应该做的,以避免边缘情况,如文件在测试和使用之间消失。你无论如何都需要try/except来覆盖这个情况,那么为什么要