1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- """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
|