在 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)