Requests Library Deep Dive - 9

Continuing the study of the requests module. Today, I am diving into requests/exceptions.py, which defines custom exception classes. These exceptions improve error handling and debugging by providing meaningful messages specific to HTTP requests and responses.

Key Concepts in requests/exceptions.py

Purpose

requests uses its own set of exceptions to clearly indicate different types of errors, rather than relying on generic Python exceptions like ValueError or OSError.

Hierarchy of Exceptions

All exceptions in requests inherit from RequestException. This allows users to catch all exceptions with a single base class if needed.

The Base Class: RequestException

  • This is the parent class for all exceptions in requests.
  • It accepts a custom message and optionally a request or response object for additional context.

Example:

1
2
3
4
5
class RequestException(IOError):
    def __init__(self, message, request=None, response=None):
        super().__init__(message)
        self.request = request
        self.response = response

Common Exceptions

HTTPError Raised when an HTTP request fails due to client-side (4xx) or server-side (5xx) errors. It’s often triggered by Response.raise_for_status().

1
2
class HTTPError(RequestException):
    pass

ConnectionError Raised when a connection to the server cannot be established.

1
2
class ConnectionError(RequestException):
    pass

Timeout Raised when a request exceeds the specified timeout.

1
2
class Timeout(RequestException):
    pass

URLRequired Raised when a URL is not provided to a request.

1
2
class URLRequired(RequestException):
    pass

TooManyRedirects Raised when the maximum number of allowed redirects is exceeded.

1
2
class TooManyRedirects(RequestException):
    pass

InvalidURL Raised when a URL is improperly formatted.

1
2
class InvalidURL(RequestException):
    pass

Less Common Exceptions

ProxyError Raised when a request fails due to issues with a proxy server.

1
2
class ProxyError(ConnectionError):
    pass

SSLError Raised for SSL/TLS-related errors, such as certificate validation failures.

1
2
class SSLError(ConnectionError):
    pass

ChunkedEncodingError Raised when the server provides malformed chunked encoding data.

1
2
class ChunkedEncodingError(RequestException):
    pass

ContentDecodingError Raised when the response body cannot be decoded.

1
2
class ContentDecodingError(RequestException):
    pass

Usage in Code

Exception handling is simplified because of this module. For example:

1
2
3
4
5
6
7
8
9
10
11
12
import requests

try:
    response = requests.get('https://example.com', timeout=1)
    response.raise_for_status()  # Raises HTTPError for 4xx/5xx responses
except requests.exceptions.Timeout:
    print("Request timed out.")
except requests.exceptions.HTTPError as err:
    print(f"HTTP error occurred: {err}")
except requests.exceptions.RequestException as err:
    print(f"An error occurred: {err}")

comments powered by Disqus