2011-08-23 10 views
8

मैं सॉकेट टाइमआउट (अधिमानतः अपवाद में) पकड़ना चाहता हूं ... except urllib.error.URLError: इसे पकड़ सकता है लेकिन मुझे मृत लिंक और टाइमआउट के बीच अंतर करने की आवश्यकता है .... अगर मैं except urllib.error.URLError: निकालता हूं सॉकेट टाइमआउट पकड़ नहीं करता है और स्क्रिप्ट एक socket.timeout त्रुटिकैच सॉकेट टाइमआउट अपवाद

import urllib.request,urllib.parse,urllib.error 
import socket 
import http 
socket.setdefaulttimeout(0.1) 


try: 
    file2 = urllib.request.Request('http://uk.geforce.com/html://') 
    file2.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13") 
    file3 = urllib.request.urlopen(file2).read().decode("utf8", 'ignore') 
except urllib.error.URLError: print('fail') 
except socket.error: print('fail') 
except socket.timeout: print('fail') 
except UnicodeEncodeError: print('fail') 
except http.client.BadStatusLine: print('fail') 
except http.client.IncompleteRead: print('fail') 
except urllib.error.HTTPError: print('fail') 

print('done') 

उत्तर

5
... 
except urllib.error.URLError, e: 
    print type(e.reason) 

आप <class 'socket.timeout'> देखेंगे जब भी वहाँ एक सॉकेट टाइमआउट है के साथ समाप्त हो जाता है। क्या ये वही है जो तुम चाहते हो?

उदाहरण के लिए:

try: 
    data = urllib2.urlopen("http://www.abcnonexistingurlxyz.com") 
except Exception,e: 
    print type(e.reason) 
... 
<class 'socket.timeout'> 
+1

मैं सिर्फ महसूस किया तुम अजगर-3.x के रूप में प्रश्न में चिह्नित है। दुर्भाग्य से, मेरे पास पाइथन 3 तक पहुंच नहीं है। उपर्युक्त कोड 2.x के लिए काम करना चाहिए जहां x> = 3। –