在Python上的例外情况下,如何重做导致异常的行

时间:2017-09-25 22:16:29

标签: python exception exception-handling

对于我的应用程序,我使用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循环读取等等。相反,如果读取失败,我需要直接重做该读取,直到它通过然后继续。

但是,我不知道如何在没有每个人阅读的情况下执行此操作,请执行上述代码。我试着寻找一个“跳转到”/“转到”前一行的等价物,但我找不到任何东西。是否有一些东西可以让我在例外时重复失败的那条线?

2 个答案:

答案 0 :(得分:1)

我建议您创建一个新函数来重试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)即可。

答案 1 :(得分:0)

所以你必须做这样的事情:

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