Raise HTTPStatusError in raise_from_status (#1072)

This commit is contained in:
François Voron 2020-07-20 14:10:57 +02:00 committed by GitHub
parent a89d4ad625
commit 27b0dbc22d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 23 additions and 9 deletions

View File

@ -267,9 +267,10 @@ We can raise an exception for any Client or Server error responses (4xx or 5xx s
404
>>> not_found.raise_for_status()
Traceback (most recent call last):
File "/Users/tomchristie/GitHub/encode/httpcore/httpx/models.py", line 776, in raise_for_status
raise HTTPError(message)
httpx.HTTPError: 404 Not Found
File "/Users/tomchristie/GitHub/encode/httpcore/httpx/models.py", line 837, in raise_for_status
raise HTTPStatusError(message, response=self)
httpx._exceptions.HTTPStatusError: 404 Client Error: Not Found for url: https://httpbin.org/status/404
For more information check: https://httpstatuses.com/404
```
Any successful response codes will simply return `None` rather than raising an exception.

View File

@ -10,6 +10,7 @@ from ._exceptions import (
CookieConflict,
DecodingError,
HTTPError,
HTTPStatusError,
InvalidURL,
NetworkError,
NotRedirectResponse,
@ -66,6 +67,7 @@ __all__ = [
"CookieConflict",
"DecodingError",
"HTTPError",
"HTTPStatusError",
"InvalidURL",
"NetworkError",
"NotRedirectResponse",

View File

@ -121,6 +121,17 @@ class DecodingError(HTTPError):
"""
class HTTPStatusError(HTTPError):
"""
Response sent an error HTTP status.
"""
def __init__(self, *args: typing.Any, response: "Response") -> None:
super().__init__(*args)
self._request = response.request
self.response = response
# Redirect exceptions...

View File

@ -23,7 +23,7 @@ from ._decoders import (
)
from ._exceptions import (
CookieConflict,
HTTPError,
HTTPStatusError,
InvalidURL,
NotRedirectResponse,
RequestNotRead,
@ -825,7 +825,7 @@ class Response:
def raise_for_status(self) -> None:
"""
Raise the `HTTPError` if one occurred.
Raise the `HTTPStatusError` if one occurred.
"""
message = (
"{0.status_code} {error_type}: {0.reason_phrase} for url: {0.url}\n"
@ -834,10 +834,10 @@ class Response:
if StatusCode.is_client_error(self.status_code):
message = message.format(self, error_type="Client Error")
raise HTTPError(message, response=self)
raise HTTPStatusError(message, response=self)
elif StatusCode.is_server_error(self.status_code):
message = message.format(self, error_type="Server Error")
raise HTTPError(message, response=self)
raise HTTPStatusError(message, response=self)
def json(self, **kwargs: typing.Any) -> typing.Any:
if self.charset_encoding is None and self.content and len(self.content) > 3:

View File

@ -98,7 +98,7 @@ async def test_raise_for_status(server):
)
if 400 <= status_code < 600:
with pytest.raises(httpx.HTTPError) as exc_info:
with pytest.raises(httpx.HTTPStatusError) as exc_info:
response.raise_for_status()
assert exc_info.value.response == response
else:

View File

@ -106,7 +106,7 @@ def test_raise_for_status(server):
"GET", server.url.copy_with(path=f"/status/{status_code}")
)
if 400 <= status_code < 600:
with pytest.raises(httpx.HTTPError) as exc_info:
with pytest.raises(httpx.HTTPStatusError) as exc_info:
response.raise_for_status()
assert exc_info.value.response == response
assert exc_info.value.request.url.path == f"/status/{status_code}"