在 Python 异常中,如何重做导致异常的行
In Python on exceptions, how do I redo line that caused the exception
对于我的应用程序,我使用 python 接口来读取微控制器的寄存器。有时,读取失败并导致异常。理想情况下,我想做的是处理异常,我想回到发生异常的同一行并重做。这意味着,基本上返回到读取寄存器失败的语句。对于一次阅读,我可以执行以下操作:
while ReadSuccess == 0:
try:
readregister();
faultReadSuccess = 1
except (KeyboardInterrupt, SystemExit):
print "Program manually stopped through Ctrl-C"
raise
except:
faultReadSuccess = 0
print "Reading failure"
time.sleep(.5)
这基本上是一次读取,只是重复读取直到通过。但是,我的程序中分散了几个寄存器读取命令,这些是对流敏感的读取,我不能只从代码的开头或一段代码开始,通过 while 循环或其他方式进行读取。相反,如果读取失败,我需要直接重做一遍读取直到它通过然后继续。
但是,如果不对每个人进行阅读,我不知道如何执行上述代码。我试着寻找 "jump to"/"go to" 前一行的等价物,但我找不到任何东西。有什么东西可以让我在异常情况下只重复失败的行吗?
所以你必须这样做:
while True:
try:
read_register_1()
except:
time.sleep(0.5)
else:
break
while True:
try:
read_register_2()
except:
time.sleep(0.5)
else:
break
我建议您创建一个新函数来重试 read_register(),并传递一个参数来控制您要重试的次数。例如,定义如下函数:
def read_retry(read_reg, n):
"""
"read_reg" is one of your read_register functions;
"n" is the retry times.
"""
i = 0 # i is the counter
while i < n:
try:
read_reg()
break # if success, then exit the loop
except:
print "Reading failure for {} time(s)".format(i+1)
time.sleep(0.5)
i = i + 1
说,你想重试 read_register_1()
3 次。只需调用 read_retry(read_register_1, 3)
。
对于我的应用程序,我使用 python 接口来读取微控制器的寄存器。有时,读取失败并导致异常。理想情况下,我想做的是处理异常,我想回到发生异常的同一行并重做。这意味着,基本上返回到读取寄存器失败的语句。对于一次阅读,我可以执行以下操作:
while ReadSuccess == 0:
try:
readregister();
faultReadSuccess = 1
except (KeyboardInterrupt, SystemExit):
print "Program manually stopped through Ctrl-C"
raise
except:
faultReadSuccess = 0
print "Reading failure"
time.sleep(.5)
这基本上是一次读取,只是重复读取直到通过。但是,我的程序中分散了几个寄存器读取命令,这些是对流敏感的读取,我不能只从代码的开头或一段代码开始,通过 while 循环或其他方式进行读取。相反,如果读取失败,我需要直接重做一遍读取直到它通过然后继续。
但是,如果不对每个人进行阅读,我不知道如何执行上述代码。我试着寻找 "jump to"/"go to" 前一行的等价物,但我找不到任何东西。有什么东西可以让我在异常情况下只重复失败的行吗?
所以你必须这样做:
while True:
try:
read_register_1()
except:
time.sleep(0.5)
else:
break
while True:
try:
read_register_2()
except:
time.sleep(0.5)
else:
break
我建议您创建一个新函数来重试 read_register(),并传递一个参数来控制您要重试的次数。例如,定义如下函数:
def read_retry(read_reg, n):
"""
"read_reg" is one of your read_register functions;
"n" is the retry times.
"""
i = 0 # i is the counter
while i < n:
try:
read_reg()
break # if success, then exit the loop
except:
print "Reading failure for {} time(s)".format(i+1)
time.sleep(0.5)
i = i + 1
说,你想重试 read_register_1()
3 次。只需调用 read_retry(read_register_1, 3)
。