2011-06-21 15 views
0

我有這樣的代碼:的Python:catch異常和重複碼

import imaplib, re 
import os 
import time 

conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
conn.login("ddd", "dddd") 

while(True): 
     unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
     print unreadCount 

     if int(unreadCount) > 10: 
       print "restarting..." 

     time.sleep(50) 

,有時會失去連接和停止工作。我怎樣才能捕獲異常並在每次破解時啓動代碼?

感謝

+1

用'conn = ...'開始的代碼圍繞try/except放置一個while循環,並在except循環中繼續。確保你實現了一些**最大重試**(例如'while(retries

回答

3
import imaplib, re 
import os 
import time 

while True: 
    try: 
     conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
     conn.login("ddd", "dddd") 

     while True : 
       unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
       print unreadCount 

       if int(unreadCount) > 10: 
         print "restarting..." 

       time.sleep(50) 
    except HypotheticalException: 
     pass 
+2

讓外層循環無限制地運行可能是不理想的。我會建議一個最大重試值來控制這個。 –

+0

@AJ:正如大多數書籍通常所說的那樣:「這是作爲練習留給讀者的」 –

0

使用try ...除了

try: 
    unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
    if int(unreadCount) > 10: 
      print "restarting..." 

    time.sleep(50) 
except Exception: 
    pass 
0

試試這個:

import imaplib, re 
import os 
import time 


for n in range(3): 
try: 
    conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
    conn.login("ddd", "dddd") 
    while(True): 
     unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
     print unreadCount 

     if int(unreadCount) > 10: 
      print "restarting..." 

     time.sleep(50) 
    break 
except Exception, e: 
    if n == 2: 
     print >>sys.stderr, "Failure During processing, restarting..." 
     print >>sys.stderr, e 

您可以將N設置要允許但多次嘗試。

編輯: 嗯,經過進一步細讀,似乎我得到你的代碼有點錯了。我編輯並修復了我的版本。你將需要調整和編輯你的while循環,因爲我不完全確定你要做什麼。

編輯2: 既然您需要重新連接並再試一次,我已經移動了try塊中的conn節。

+0

允許您再次運行代碼?我不太明白「n」的意義。 – donald

+0

成功後,中斷將退出for循環。如果失敗,則檢查n。如果小於2,則打印該錯誤並重試。否則,請退出嘗試。 –

+0

「conn」必須位於try內,因爲如果出現錯誤,我需要再次連接。 – donald