httpx
Dispatch provides a built-in integration with httpx, offering proper error handling out of the box. It’s enabled by default and it takes no extra code to set it up.
import dispatch
@dispatch.functiondef fetch_cat_fact(): response = httpx.get("https://cat-facts.dispatch.run")
# Raise `httpx.HTTPError` exception when request is not successful response.raise_for_status()
return response.text
def main(): fetch_cat_fact.dispatch()
dispatch.run(main)
Exception handling
HTTPStatusError
Depending on the status_code
attribute, a different Dispatch behavior is applied.
HTTP status code | Description | Dispatch status |
---|---|---|
1xx | Informational | Status.PERMANENT_ERROR |
2xx | Successful | Status.OK |
3xx | Redirection | Status.PERMANENT_ERROR |
3xx | Redirection | Status.PERMANENT_ERROR |
4xx | Client error | Status.PERMANENT_ERROR |
400 | Bad request | Status.INVALID_ARGUMENT |
401 | Unauthorized | Status.UNAUTHENTICATED |
403 | Forbidden | Status.PERMISSION_DENIED |
404 | Not found | Status.NOT_FOUND |
408 | Request timeout | Status.TIMEOUT |
429 | Too many requests | Status.THROTTLED |
5xx | Server error | Status.TEMPORARY_ERROR |
501 | Not implemented | Status.PERMANENT_ERROR |
InvalidURL
Returns Status.INVALID_ARGUMENT
.
UnsupportedProtocol
Returns Status.INVALID_ARGUMENT
.
TimeoutException
Returns Status.TIMEOUT
.
HTTPError
Returns Status.TEMPORARY_ERROR
, unless exception is HTTPStatusError
, InvalidURL
, UnsupportedProtocol
or TimeoutException
, since HTTPError
is a parent class of these. Learn more in httpx documentation.
StreamError
Returns Status.TEMPORARY_ERROR
CookieConflict
Returns Status.TEMPORARY_ERROR
.
Response handling
If a function returns httpx.Response
instance, Dispatch looks at the status_code
attribute and determines behavior the same way as HTTPStatusError
exception.
import dispatch
@dispatch.functiondef fetch_cat_fact(): response = httpx.get("https://cat-facts.dispatch.run") return response