如果出现错误,我可以在try/except块中传递尝试部分吗



我有一个函数,它打印东西,但这个函数在某些值上出错。所以我使用了try/except块来解决这个问题,但即使函数出现错误,它也会一直打印直到出现错误。功能如下:

def error_solver(x):
try:
function(x)
except:
error_solver(x+1)
error_solver(0)

如果你不能理解我在这里说的是另一个例子:

def f(x):
try:
function_1()
function_2()
except:
pass

假设函数2((中发生错误。在这种情况下,如果function_1((工作时没有错误,它将被执行。我不希望这种情况发生,只是在不执行第一个函数的情况下结束函数。我该如何解决这个问题?

您可以通过将系统恢复到以前的状态或众所周知的状态,或者缓冲try块的结果,并仅在try块结束时应用结果,来防止在中途留下try-except块。

如果你的函数只做打印,那么最后一种方法可能是有意义的:

您可以打印到字符串,而不是打印到屏幕上,并且只在最后将生成的字符串打印到屏幕。要使其工作,您必须修改function_1()function_2()以采用file参数:

import io, sys
def function_1(file):
print("hi from function_1", file=file)
def function_2(file):
print("hi from function_2", file=file)
def f(x):
try:
with io.StringIO() as file:
function_1(file)
function_2(file)
sys.stdout.write(file.getvalue())
except:
pass

在您的示例中,无论function_2是否失败,function_1都将始终在function_2之前执行。如果您需要function_1(); function_2()操作是事务性的(两者都成功或什么都不发生(,您可以添加一个显式撤消操作:

def f(x):
try:
function_1()
function_2()
except Function2Error:
undo_function_1()

Python将执行所有行,直到到达错误行。因此,我们无法撤消在function_1中执行的操作。

最新更新