2013-09-25 85 views
2

我正在嘗試編寫一個簡單的程序,它使用urllib2進行一些錯誤處理。代碼如下所示Python urllib2錯誤閱讀

try: 
    urllib2.Request(...) 
except HTTPError as e: 
    self.log.debug("HTTP Error for url %s is %s" % (e.url, e.read())) 

重點是除了e.message之外,還要轉儲錯誤頁面。然而,偶爾我會得到消息UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 4030: ordinal not in range(128),我相信這是因爲e.read()假定ascii字符集的內容在哪裏,因爲返回的頁面可能有其他內容。

我的問題是我該如何解決這個問題?即,我希望有一個「合理」的信息傾銷信息。我同意這也取決於我試圖連接的URL返回的字符集和編碼,但是如果在我的Python e.read方法中有任何方法不嘗試確保ASCII字符

+1

如果'self.log'是一個標準的日誌對象的引用,你不應該做的串插,但通過插值作爲參數:'log.debug(「嗒嗒%S爲%s」,E .url,e.read())'。這有幫助嗎? –

+0

它不是標準的日誌記錄對象。如果我只是想要打印呢?對不起,我不明白這會有什麼幫助? –

+0

因爲您對問題的診斷是錯誤的。 'e.read()'不是假設任何關於字符的東西,也不關心。這是問題的字符串插值。 –

回答

1

只需使用encode和它會工作,這只是編碼問題。

try: 
    urllib2.Request(...) 
except HTTPError as e: 
    self.log.debug("HTTP Error for url %s is %s" % (e.url, e.read().encode('utf8')))