2013-01-16 49 views
1

我有這樣的代碼:如何獲取異常的實例類型?

try: 
    self.client.post(url, data, self.cookies, headers, auth, jsonrpc) 
    self.status = self.client.status 
    self.mytime = self.client.time 
    self.text = self.client.text 
    self.length = len(self.text) 
except urllib2.URLError, error: 
    print error 
    self.exception = True 
    self.urrlib2 = True 
    if isinstance(error.reason, socket.timeout): 
     self.timeout = True 

但有時我得到異常打印出這樣的:

URLError in POST > reason=The read operation timed out > <urlopen error The read operation timed out> 

這些由except urllib2.URLError處理。他們應該通過if isinstance(error.reason, socket.timeout)測試,但他們不通過。

所以我想知道這個異常是什麼instance。我怎樣才能做到這一點?

+0

'型()'給你一個對象的類型或類的字符串表示。 –

+0

所以你的意思是我應該在這裏輸入(error)'?我必須修改我的代碼,並且異常將需要幾個小時才能顯示...或者是type(error.reason)'? – dangonfast

+0

'print type(error.reason)'將幫助您診斷它是什麼類型;沒有太多的答案,因此只是一個評論。 –

回答

1

type() function返回對象的類型。

你可以使用print type(error.reason)診斷是在這種情況下,什麼類型的對象reason的。

+0

我發現,這是實例ssl.SSLError'的'。我想知道這與'urllib2.URLError' – dangonfast

+0

嗯有什麼關係。我看到這個http://docs.python.org/2/library/ssl.html。 'ssl.SSLError'屬於子類型'socket.error',它是子類型'IOError'。我不知道爲什麼它會通過'urllib2.URLError,error'代碼。 – dangonfast

+0

@gonvaled:'urllib2'代碼捕獲該異常,然後引發'URLError(originalexception)',並將該參數存儲爲'.reason'。 –

0

使用此:

import sys 

try: 
    self.client.post(url, data, self.cookies, headers, auth, jsonrpc) 
    self.status = self.client.status 
    self.mytime = self.client.time 
    self.text = self.client.text 
    self.length = len(self.text) 
except urllib2.URLError, error: 
    print error 
    self.exception = True 
    self.urrlib2 = True 

    errno, errstr = sys.exc_info()[:2] 
    if errno == socket.timeout: 
     print "There was a timeout" 
     self.timeout = True