2015-06-30 178 views
0

我想通過在Python中編寫國際空間站跟蹤器來了解python中的異常處理。urllib2和嘗試/除了在循環中

我已閱讀https://docs.python.org/2/tutorial/errors.html,發現Handle errors with urllib2有用,但我很努力去理解如何讓代碼繼續循環,儘管引發了異常,我不知道如何進一步研究。

我有這個工作代碼。它在我的Raspberry Pi上運行數日,作爲更大程序的一部分,當ISS開銷時,綠燈會亮起。但最終會導致錯誤,並且程序停止。我正在尋找一種方法,即使錯誤被調用,程序也能繼續。即這個函數每10秒調用一次,但如果出現錯誤,我希望程序在10秒後再次嘗試,同時注意到錯誤。

def issPosition(n): 
    try: 
     req = urllib2.Request("http://api.open-notify.org/iss-now.json") 
     response = urllib2.urlopen(req) 
     obj = json.loads(response.read()) 
     if n == "lat": 
      return obj['iss_position']['latitude'] 
     elif n == "long": 
      return obj['iss_position']['longitude'] 

    except urllib2.HTTPError, e: 
     GPIO.output(24,True) 
     time.sleep(0.1) 
     GPIO.output(24,False) 
     print 'HTTPError = ' + str(e.code) 

    except urllib2.URLError, e: 
     GPIO.output(26,True) 
     time.sleep(0.1) 
     GPIO.output(26,False) 
     print 'URLError = ' + str(e.reason) 

    except httplib.HTTPException, e: 
     GPIO.output(26,True) 
     time.sleep(0.1) 
     GPIO.output(26,False) 
     print 'HTTPException' 

    except Exception: 
     GPIO.output(26,True) 
     time.sleep(0.1) 
     GPIO.output(26,False) 
     import traceback 
     print 'generic exception: ' + traceback.format_exc() 

指針將不勝感激。謝謝。

+0

睡10秒鐘並記錄錯誤 –

+0

什麼是未捕獲的錯誤? – drolando

+0

我會折射你的代碼,所以你不要重複自己(__DRY__)。重複執行幾行代碼,這將有助於將它放入一個函數中,所以如果您想改變睡眠時間,可以在一個地方而不是3個地方進行更改。另外,您仍然可以在最後一個除外代碼塊中將e作爲Exception來傳遞,並且鑄造成一個字符。最後,通過處理錯誤,它將繼續。沒有其他的事情需要你去做。有一個原因,爲什麼它不喜歡做嘗試/除了一個特定的錯誤。 – rady

回答

0

我在代碼中看不到任何循環。你是從循環調用issPosition嗎? 如果是,請不要處理此方法中的異常或重新拋出異常。並處理循環中的異常並繼續執行。 例如:

while(True): 
    try: 
    result = issPosition(12334584) 
    # Use your result here .... 
    except: 
    # Log and continue 
    continue 

**這將永遠運行。您可能想要添加額外的邏輯來最終結束循環。

+0

這是爲什麼被拒絕投票?探索「繼續」似乎是一個好的步驟? – Russell

+0

@Russell可能是因爲它做法不好的做法:/除了:那樣。一般來說,你只想捕捉你可以處理的錯誤。如果你在遍歷一個NoneType並且在程序的後面會導致問題破壞其他東西,會發生什麼?通常情況下會引發一個NoneType錯誤,但這種方式什麼都不做。你又如何退出?你不能做鍵盤中斷,除了會抓住這個。你可以添加額外的邏輯來結束循環,但這會很痛苦。 – rady

+0

我的答案是給出一個想法來解決這個問題。任何解決方案都會涉及類似的東西,您可能會選擇有選擇地處理異常。而最重要的是,如果要求永遠運行,我們必須這樣做。其他一切都只是談話。 – gipsy