mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
	
	
		
			60 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
	
		
			2.2 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 | ||
|  | 
 | ||
|  | # 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) | ||
|  | 
 | ||
|  | # 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 |