Я использую модуль requests
с опцией max_retries
. Я хотел бы поймать исключения, связанные только с таймаутами и медленными ответами:
import requests
from requests.exceptions import ConnectTimeout, Timeout
URL = 'http://exmaple.com/sleep' # sleeps for 5 seconds before reply
with requests.Session() as s:
try:
a = requests.adapters.HTTPAdapter(max_retries=2)
s.mount('http://', a)
r = s.get(URL, timeout=1)
except (ConnectTimeout, Timeout) as err:
print('# {} - timeout'.format(URL))
Но похоже, что базовая urllib3
библиотека бросает ReadTimeoutError
, а requests
не ловит его и выбрасывает ConnectionError
вместо:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='example.com', port=80): Max retries exceeded with url: /sleep (Caused by ReadTimeoutError("HTTPConnectionPool(host='example.com', port=80): Read timed out. (read timeout=1)"))
Я не хочу добавлять ConnectionError
в список, потому что есть другие исключения, которые наследуются от него, поэтому он также перехватывает их.
Есть ли способ перехватить исходное исключение или, возможно, все исключения в цепочке, используя модуль traceback
.