mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Exception classes raised by urllib.
 | 
						|
 | 
						|
The base exception class is URLError, which inherits from IOError.  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']
 | 
						|
 | 
						|
 | 
						|
# do these error classes make sense?
 | 
						|
# make sure all of the IOError stuff is overridden.  we just want to be
 | 
						|
# subtypes.
 | 
						|
 | 
						|
class URLError(IOError):
 | 
						|
    # URLError is a sub-type of IOError, but it doesn't share any of
 | 
						|
    # the implementation.  need to override __init__ and __str__.
 | 
						|
    # It sets self.args for compatibility with other EnvironmentError
 | 
						|
    # 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)
 | 
						|
 | 
						|
    # since URLError specifies a .reason attribute, HTTPError should also
 | 
						|
    #  provide this attribute. See issue13211 for discussion.
 | 
						|
    @property
 | 
						|
    def reason(self):
 | 
						|
        return self.msg
 | 
						|
 | 
						|
# exception raised when downloaded size does not match content-length
 | 
						|
class ContentTooShortError(URLError):
 | 
						|
    def __init__(self, message, content):
 | 
						|
        URLError.__init__(self, message)
 | 
						|
        self.content = content
 |