我有一个函数,它打印东西,但这个函数在某些值上出错。所以我使用了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中执行的操作。