OLD | NEW |
(Empty) | |
| 1 """Exception classes raised by urllib. |
| 2 |
| 3 The base exception class is URLError, which inherits from IOError. It |
| 4 doesn't define any behavior of its own, but is the base class for all |
| 5 exceptions defined in this package. |
| 6 |
| 7 HTTPError is an exception class that is also a valid HTTP response |
| 8 instance. It behaves this way because HTTP protocol errors are valid |
| 9 responses, with a status code, headers, and a body. In some contexts, |
| 10 an application may want to handle an exception like a regular |
| 11 response. |
| 12 """ |
| 13 from __future__ import absolute_import, division, unicode_literals |
| 14 from future import standard_library |
| 15 |
| 16 from future.backports.urllib import response as urllib_response |
| 17 |
| 18 |
| 19 __all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] |
| 20 |
| 21 |
| 22 # do these error classes make sense? |
| 23 # make sure all of the IOError stuff is overridden. we just want to be |
| 24 # subtypes. |
| 25 |
| 26 class URLError(IOError): |
| 27 # URLError is a sub-type of IOError, but it doesn't share any of |
| 28 # the implementation. need to override __init__ and __str__. |
| 29 # It sets self.args for compatibility with other EnvironmentError |
| 30 # subclasses, but args doesn't have the typical format with errno in |
| 31 # slot 0 and strerror in slot 1. This may be better than nothing. |
| 32 def __init__(self, reason, filename=None): |
| 33 self.args = reason, |
| 34 self.reason = reason |
| 35 if filename is not None: |
| 36 self.filename = filename |
| 37 |
| 38 def __str__(self): |
| 39 return '<urlopen error %s>' % self.reason |
| 40 |
| 41 class HTTPError(URLError, urllib_response.addinfourl): |
| 42 """Raised when HTTP error occurs, but also acts like non-error return""" |
| 43 __super_init = urllib_response.addinfourl.__init__ |
| 44 |
| 45 def __init__(self, url, code, msg, hdrs, fp): |
| 46 self.code = code |
| 47 self.msg = msg |
| 48 self.hdrs = hdrs |
| 49 self.fp = fp |
| 50 self.filename = url |
| 51 # The addinfourl classes depend on fp being a valid file |
| 52 # object. In some cases, the HTTPError may not have a valid |
| 53 # file object. If this happens, the simplest workaround is to |
| 54 # not initialize the base classes. |
| 55 if fp is not None: |
| 56 self.__super_init(fp, hdrs, url, code) |
| 57 |
| 58 def __str__(self): |
| 59 return 'HTTP Error %s: %s' % (self.code, self.msg) |
| 60 |
| 61 # since URLError specifies a .reason attribute, HTTPError should also |
| 62 # provide this attribute. See issue13211 for discussion. |
| 63 @property |
| 64 def reason(self): |
| 65 return self.msg |
| 66 |
| 67 def info(self): |
| 68 return self.hdrs |
| 69 |
| 70 |
| 71 # exception raised when downloaded size does not match content-length |
| 72 class ContentTooShortError(URLError): |
| 73 def __init__(self, message, content): |
| 74 URLError.__init__(self, message) |
| 75 self.content = content |
OLD | NEW |