Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document exceptions #1138

Merged
merged 4 commits into from
Aug 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions docs/exceptions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
# Exceptions

## Request and Response exceptions

The most important exception classes in HTTPX are `RequestError` and `HTTPStatusError`.

The `RequestError` class is a superclass that encompasses any exception that occurs
while issuing an HTTP request. These exceptions include a `.request` attribute.

```python
try:
response = httpx.get("https://www.example.com/")
except httpx.RequestError as exc:
print(f"An error occured while requesting {exc.request.url!r}.")
```

The `HTTPStatusError` class is raised by `response.raise_for_status()` on 4xx and 5xx responses.
These exceptions include both a `.request` and a `.response` attribute.

```python
response = httpx.get("https://www.example.com/")
try:
response.raise_for_status()
except httpx.HTTPStatusError as exc:
print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.")
```

There is also a base class `HTTPError` that includes both of these categories, and can be used
to catch either failed requests, or 4xx and 5xx responses.

You can either use this base class to catch both categories...

```python
try:
response = httpx.get("https://www.example.com/")
response.raise_for_status()
except httpx.HTTPError as exc:
print(f"Error while requesting {exc.request.url!r}.")
```

Or handle each case explicitly...

```python
try:
response = httpx.get("https://www.example.com/")
response.raise_for_status()
except httpx.RequestError as exc:
print(f"An error occured while requesting {exc.request.url!r}.")
except httpx.HTTPStatusError as exc:
print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.")
```

---

## The exception hierarchy

* HTTPError
* RequestError
* TransportError
* TimeoutException
* ConnectTimeout
* ReadTimeout
* WriteTimeout
* PoolTimeout
* NetworkError
* ConnectError
* ReadError
* WriteError
* CloseError
* ProtocolError
* LocalProtocolError
* RemoteProtocolError
* ProxyError
* UnsupportedProtocol
* DecodingError
* TooManyRedirects
* RequestBodyUnavailable
* HTTPStatusError
* NotRedirectResponse
* CookieConflict
* StreamError
* StreamConsumed
* ResponseNotRead
* RequestNotRead
* ResponseClosed

---

## Exception classes

::: httpx.HTTPError
:docstring:

::: httpx.RequestError
:docstring:

::: httpx.TransportError
:docstring:

::: httpx.TimeoutException
:docstring:

::: httpx.ConnectTimeout
:docstring:

::: httpx.ReadTimeout
:docstring:

::: httpx.WriteTimeout
:docstring:

::: httpx.PoolTimeout
:docstring:

::: httpx.NetworkError
:docstring:

::: httpx.ConnectError
:docstring:

::: httpx.ReadError
:docstring:

::: httpx.WriteError
:docstring:

::: httpx.CloseError
:docstring:

::: httpx.ProtocolError
:docstring:

::: httpx.LocalProtocolError
:docstring:

::: httpx.RemoteProtocolError
:docstring:

::: httpx.ProxyError
:docstring:

::: httpx.UnsupportedProtocol
:docstring:

::: httpx.DecodingError
:docstring:

::: httpx.TooManyRedirects
:docstring:

::: httpx.RequestBodyUnavailable
:docstring:

::: httpx.HTTPStatusError
:docstring:

::: httpx.NotRedirectResponse
:docstring:

::: httpx.CookieConflict
:docstring:

::: httpx.StreamError
:docstring:

::: httpx.StreamConsumed
:docstring:

::: httpx.ResponseNotRead
:docstring:

::: httpx.RequestNotRead
:docstring:

::: httpx.ResponseClosed
:docstring:
14 changes: 9 additions & 5 deletions httpx/_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,17 @@ class HTTPError(Exception):
Base class for `RequestError` and `HTTPStatusError`.

Useful for `try...except` blocks when issuing a request,
and then calling .raise_for_status().
and then calling `.raise_for_status()`.

For example:

```
try:
response = httpx.get("https://www.example.com")
response.raise_for_status()
except httpx.HTTPError as exc:
print(f"HTTP Exception for {exc.request.url} - {exc.message}")
```
"""

def __init__(self, message: str, *, request: "Request") -> None:
Expand All @@ -72,7 +74,9 @@ def __init__(self, message: str, *, request: "Request") -> None:

class TransportError(RequestError):
"""
Base class for all exceptions that are mapped from the httpcore API.
Base class for all exceptions that occur at the level of the Transport API.

All of these exceptions also have an equivelent mapping in `httpcore`.
"""


Expand Down Expand Up @@ -151,7 +155,7 @@ class CloseError(NetworkError):

class ProxyError(TransportError):
"""
An error occurred while proxying a request.
An error occurred while establishing a proxy connection.
"""


Expand Down Expand Up @@ -192,7 +196,7 @@ class RemoteProtocolError(ProtocolError):

class DecodingError(RequestError):
"""
Decoding of the response failed.
Decoding of the response failed, due to a malformed encoding.
"""


Expand All @@ -214,7 +218,7 @@ class RequestBodyUnavailable(RequestError):

class HTTPStatusError(HTTPError):
"""
Response sent an error HTTP status.
The response had an error HTTP status of 4xx or 5xx.

May be raised when calling `response.raise_for_status()`
"""
Expand Down
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ nav:
- Environment Variables: 'environment_variables.md'
- Requests Compatibility: 'compatibility.md'
- Developer Interface: 'api.md'
- Exceptions: 'exceptions.md'
- Third Party Packages: 'third-party-packages.md'
- Contributing: 'contributing.md'

Expand Down