2017-09-25 88 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