2014-04-09 46 views
0

假設我有位於(host:port)的http服務器,並且我試圖使用tornado文檔中的HTTPClient示例從該服務器獲取一些數據,所以我在下面有一個代碼獲取來自龍捲風的套接字級錯誤HTTPClient

from tornado import httpclient 

http_client = httpclient.HTTPClient() 
try: 
    response = http_client.fetch("http://host:port", connect_timeout=2) 
    print response.body 

except httpclient.HTTPError as e: 
    print e.code 
    print e.message 

http_client.close() 

這工作正常,並且如果一切順利的話(主機可用,服務器工作正常等),我的客戶成功地從服務器接收數據。現在我想處理連接過程中可能發生的錯誤,並根據錯誤代碼處理它們。我試圖通過在我的異常處理程序中使用e.code來獲取錯誤代碼,但它只包含HTTP錯誤代碼,並且我需要一些較低級別的錯誤代碼,例如:

1)如果服務器無法在目的地主機和端口它打印出

599 
HTTP 599: [Errno 111] Connection refused 

2)如果它是不可能達到的主機(例如,由於網絡連接問題),我收到相同的HTTP 599錯誤代碼:

599 
HTTP 599: [Errno 101] Connection refused 

所以我需要在我的異常處理程序中獲取Errno,它會顯示實際的值更水平的套接字錯誤,我現在看到的唯一解決方案是從我收到的文本消息(e.message)中grep它,但這個解決方案看起來粗糙和醜陋。

回答

0

我認爲你唯一的選擇是將其拉出e.message的:

import re 
m = re.search("\[Errno (\d+)\]", e.message) 
if m: 
    errno = m.group(1) 

在我的平臺(Linux)的,其實我得到一個socket.gaierror異常,當我把你的代碼示例和使用僞造的URL,它提供了對errno的直接訪問。但是,如果你正在處理tornado.httpclient.HTTPError,我不認爲你有任何直接獲取它的方法。

+0

現在(從Tornado 3.2開始)解析錯誤信息是對某些錯誤可以做的最好的,但我會嘗試在未來的版本中解決這個問題。請注意,您不能保證獲得HTTPError;當這是固定的,它可能會直接引發IOError。 (如果你使用的是curl_httpclient而不是simple_httpclient,你會得到一個CurlError) –

+0

感謝你的回答 – risboo6909