<br><br><div class="gmail_quote">On Sat, Apr 5, 2008 at 2:48 PM, Niall O&#39;Higgins &lt;<a href="mailto:niallo@unworkable.org">niallo@unworkable.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
I have written a number of long-running Python programs which make heavy use of<br>
urllib2.urlopen() to fetch HTTP URLs in a convenient manner. &nbsp;While the<br>
documentation states that this function &quot;Raises URLError on errors&quot;, I have<br>
found this to be incorrect. &nbsp;So far I have encountered the following exceptions<br>
being thrown by urllib2.urlopen() on HTTP URLs:<br>
<br>
 &nbsp; &nbsp;* urllib2.HTTPError<br>
 &nbsp; &nbsp;* urllib2.URLError<br>
 &nbsp; &nbsp;* httplib.BadStatusLine<br>
 &nbsp; &nbsp;* httplib.InvalidURL<br>
 &nbsp; &nbsp;* ValueError<br>
 &nbsp; &nbsp;* IOError<br>
<br>
Looking at the urllib2 module source, it is unclear to me whether the intention<br>
is that all httplib errors should be caught and raised as URLError or whether<br>
the programmer is expected to handle the underlying exceptions himself.<br>
<br>
For example, at least socket.error is caught by urllib2.urlopen() and raised as a URLError. &nbsp;The comment in the code block suggests some confusion:<br>
</blockquote><div><br>urllib2 is a pretty big mess and does unfortunately violate the general rule of exception catching + retyping + reraising being a bad idea.<br><br>That said, you can reduce the above list of exceptions a bit thanks to their inheritance.&nbsp; URLError inherits from IOError.&nbsp; All httplib errors inherit from httplib.HTTPException.&nbsp; This leaves you with (IOError, socket.error, httplib.HTTPException, ValueError) as the ones you should catch.&nbsp; I changed socket.error to inherit from IOError in Python 2.6.&nbsp; That narrows the list down to a sane pair of exceptions if the ValueErrors can be fixed.<br>
<br>IMHO if you&#39;re ever seeing a ValueError out of urllib2 in normal sane use please try to figure out why, make a simple test case and file it on <a href="http://bugs.python.org">bugs.python.org</a> if you believe it is a case that the library should handle.&nbsp; double plus good if it includes a patch to fix it.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;try:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;h.request(req.get_method(), req.get_selector(), req.data, headers)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r = h.getresponse()<br>
 &nbsp; &nbsp; &nbsp; &nbsp;except socket.error, err: # XXX what error?<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise URLError(err)<br>
<br>
I think this is a problem which needs to be addressed, at the very least<br>
through clearer documentation, and possibly by improving urllib2 to handle more<br>
of these exceptions and raise them as URLError.<br>
<br>
I&#39;m new to the Python development community, but would be happy to submit a<br>
patch if there is some consensus on which approach to take.<br>
<br>
Thanks!<br></blockquote></div><br>