Как поймать оригинальное исключение - PullRequest
2 голосов
/ 01 ноября 2019

Я использую модуль 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.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

В идеале вы должны перехватить другие исключения выше ConnectionError и вызвать их, если хотите, чтобы ваша программа выдавала ошибку.

class OtherException(requests.exceptions.ConnectionError):
    pass

try:
    raise OtherException('This is other exception.')
except OtherException as oe:
    raise oe
except requests.exceptions.ConnectionError:
    print('The error you want to catch')
0 голосов
/ 01 ноября 2019

Вы можете использовать аналогичную конструкцию:

import traceback
import logging

try:
    whatever()
except Exception as e:
    logging.error(traceback.format_exc())
    # Your actions here

Это будет почти все, кроме, например, KeyboardInterrupt и SystemExit.

Из-за того, что эти сценарии очень трудно выйти из сценария.

...