| """Exception classes raised by urllib. |
| |
| The base exception class is URLError, which inherits from OSError. It |
| doesn't define any behavior of its own, but is the base class for all |
| exceptions defined in this package. |
| |
| HTTPError is an exception class that is also a valid HTTP response |
| instance. It behaves this way because HTTP protocol errors are valid |
| responses, with a status code, headers, and a body. In some contexts, |
| an application may want to handle an exception like a regular |
| response. |
| """ |
| |
| import urllib.response |
| |
| __all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] |
| |
| |
| class URLError(OSError): |
| # URLError is a sub-type of OSError, but it doesn't share any of |
| # the implementation. need to override __init__ and __str__. |
| # It sets self.args for compatibility with other OSError |
| # subclasses, but args doesn't have the typical format with errno in |
| # slot 0 and strerror in slot 1. This may be better than nothing. |
| def __init__(self, reason, filename=None): |
| self.args = reason, |
| self.reason = reason |
| if filename is not None: |
| self.filename = filename |
| |
| def __str__(self): |
| return '<urlopen error %s>' % self.reason |
| |
| |
| class HTTPError(URLError, urllib.response.addinfourl): |
| """Raised when HTTP error occurs, but also acts like non-error return""" |
| __super_init = urllib.response.addinfourl.__init__ |
| |
| def __init__(self, url, code, msg, hdrs, fp): |
| self.code = code |
| self.msg = msg |
| self.hdrs = hdrs |
| self.fp = fp |
| self.filename = url |
| # The addinfourl classes depend on fp being a valid file |
| # object. In some cases, the HTTPError may not have a valid |
| # file object. If this happens, the simplest workaround is to |
| # not initialize the base classes. |
| if fp is not None: |
| self.__super_init(fp, hdrs, url, code) |
| |
| def __str__(self): |
| return 'HTTP Error %s: %s' % (self.code, self.msg) |
| |
| def __repr__(self): |
| return '<HTTPError %s: %r>' % (self.code, self.msg) |
| |
| # since URLError specifies a .reason attribute, HTTPError should also |
| # provide this attribute. See issue13211 for discussion. |
| @property |
| def reason(self): |
| return self.msg |
| |
| @property |
| def headers(self): |
| return self.hdrs |
| |
| @headers.setter |
| def headers(self, headers): |
| self.hdrs = headers |
| |
| |
| class ContentTooShortError(URLError): |
| """Exception raised when downloaded size does not match content-length.""" |
| def __init__(self, message, content): |
| URLError.__init__(self, message) |
| self.content = content |