Поймать asyncio.exceptions.TimeoutError как на python 3.8, так и на python 3.6 - PullRequest
0 голосов
/ 14 июля 2020

Я использую asyncio с веб-сокетами, и мне нужно что-то сделать, когда сокет закрыт или время ожидания истекло:

try:
    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            print(msg)
except concurrent.futures._base.CancelledError:
    print("Cancelled")
    pass
except (concurrent.futures._base.TimeoutError, asyncio.exceptions.TimeoutError):
    print("Timedout")
    pass

Мне нужно, чтобы этот код работал как на Python 3.6, так и на 3.8, но asyncio.exceptions не определен в Python 3.6.

Что мне делать?

1 Ответ

0 голосов
/ 14 июля 2020

Каждый раз, когда вы используете идентификатор, начинающийся с символа подчеркивания, например _base, вы почти наверняка делаете ошибку - даже если эти имена сейчас работают, они являются внутренними для реализации и могут быть изменены без уведомления.

Что мне делать?

Хороший способ действий - поиск имени publi c в документации. Например, поиск в Google asyncio timeouterror приводит к asyncio.TimeoutError publi c name. Аналогично, CancelledError отображается asyncio как asyncio.CancelledError - тот факт, что он взят из того же исключения в concurrent.futures, является лишь деталью реализации.

...