Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling urllib2's timeout? - Python

I'm using the timeout parameter within the urllib2's urlopen.

urllib2.urlopen('http://www.example.org', timeout=1) 

How do I tell Python that if the timeout expires a custom error should be raised?


Any ideas?

like image 895
RadiantHex Avatar asked Apr 26 '10 10:04

RadiantHex


2 Answers

There are very few cases where you want to use except:. Doing this captures any exception, which can be hard to debug, and it captures exceptions including SystemExit and KeyboardInterupt, which can make your program annoying to use..

At the very simplest, you would catch urllib2.URLError:

try:     urllib2.urlopen("http://example.com", timeout = 1) except urllib2.URLError, e:     raise MyException("There was an error: %r" % e) 

The following should capture the specific error raised when the connection times out:

import urllib2 import socket  class MyException(Exception):     pass  try:     urllib2.urlopen("http://example.com", timeout = 1) except urllib2.URLError, e:     # For Python 2.6     if isinstance(e.reason, socket.timeout):         raise MyException("There was an error: %r" % e)     else:         # reraise the original error         raise except socket.timeout, e:     # For Python 2.7     raise MyException("There was an error: %r" % e) 
like image 83
dbr Avatar answered Oct 23 '22 12:10

dbr


In Python 2.7.3:

import urllib2 import socket  class MyException(Exception):     pass  try:     urllib2.urlopen("http://example.com", timeout = 1) except urllib2.URLError as e:     print type(e)    #not catch except socket.timeout as e:     print type(e)    #catched     raise MyException("There was an error: %r" % e) 
like image 29
eshizhan Avatar answered Oct 23 '22 13:10

eshizhan