2017-09-25 59 views
0

对于我的应用程序,我使用python接口来读取微控制器的寄存器。有时,读取失败并导致异常。理想情况下,我想要做的是出现异常,我想回到有异常并重做它的同一行。这意味着,基本上回到阅读注册表失败的陈述。我可以为一个单一的读取做以下几点:在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循环或某物读取一段代码。相反,如果读取失败,我需要直接重做读取直到它通过,然后继续。

但是,我不知道如何做到这一点,没有为每个人阅读,做上面提到的代码。我试图寻找一个“跳转到”/“去”相当于上一行,但我找不到任何东西。有没有什么能让我在例外情况下重复失败的路线?

+1

编写一个函数来执行读取循环,并调用函数。 – user2357112

回答

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)

+0

感谢@Quinn的快速响应。它是一个很好的解决方案,并节省了大量额外的代码编写。真的很感激它 –

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