Python. Асинхронная функция вызывает исключение, и попытка поймать не помогает его поймать

#python #exception #python-asyncio

#python #исключение #python-asyncio

Вопрос:

Я делаю бота для работы с Bitmax market. Вот класс бота. Он подключен к Bitmax с помощью websocket и REST, а также создает сервер REST для веб-клиента.

 class MarketBot:
    async def handle_data(self):
        @self.ws.add_dispatcher(name='receiver')
        async def handler(msg):
            if msg['m'] == 'order':
                try:
                    order_id = msg['data']['orderId']
                    status = msg['data']['st']
                    if status in ('Filled', 'PartiallyFilled'):
                        raw = f'Ордер на бирже Bitmax сработал'
                        if self.sms_on:
                            await self.sms.send_sms([self.sms_phone], raw)
                    elif status != 'New':
                        self._logger.info(status)
                except Exception as exc:
                    self._logger.exception(exc)
                    raise exc

        while True:
            try:
                await self.ws.handle_messages(close_exc=False)
            except self.ws.WSClosed as exc:
                await self.ws.__aenter__()
                continue

        return result
    async def bot(self):
        try:
            await self.subscribe_to_channel(
                f'order:cash', id='abc')

            self.tasks = asyncio.gather(
                self.handle_data(),
                self.handle_rate(),
                self.send_from_queue(),
            )

            await self.tasks
        except asyncio.CancelledError:
            return None
  

Вот класс для работы с подключением к WebSocket

 class BitmaxWebSocket:
    async def dispatch(self, message):
        if message.type in (
            aiohttp.WSMsgType.CLOSE,
            aiohttp.WSMsgType.CLOSED,
            aiohttp.WSMsgType.CLOSING,
        ):
            exc = self.WSClosed(f'Dispatch: WebSocket apparently closedn{message}')
            self._logger.error(message)
            raise exc
        elif message.type != aiohttp.WSMsgType.TEXT:
            exc = ValueError(f'Non-text messagen{message}')
            self._logger.exception(exc)
            raise exc
        try:
            data = message.json()
            if data['m'] == 'ping':
                if int(data['hp']) < 3:
                    self._logger.warning(data)
                await self.send_json(op='pong', data={})
            else:
                for dispatcher in self._dispatchers:
                    asyncio.create_task(dispatcher.func(data))
        except ValueError as exc:
            self._logger.exception(exc)
            raise exc

    async def handle_messages(self, close_exc=True):
        while True:
            try:
                if self.is_closed():
                    raise self.WSClosed('Handling: WebSocket apparently closed')
                message = await self._ws_connection.receive()
                message = await self.dispatch(message)
            except self.WSClosed as exc:
                self._logger.exception(exc)
                if close_exc:
                    raise exc
                await self.__aenter__()
                continue
            except Exception as exc:
                self._logger.exception(exc)
                raise exc
  

Возникает эта ошибка, но она не продолжает работать.

 [13:56:58 22.10.2020] level=ERROR  Dispatch: WebSocket apparently closed
WSMessage(type=<WSMsgType.CLOSING: 256>, data=None, extra=None)
Traceback (most recent call last):
  File "/home/market-bot/market-bot/bitmax-bot/api/bitmax_api.py", line 225, in handle_messages
    message = await self.dispatch(message)
  File "/home/market-bot/market-bot/bitmax-bot/api/bitmax_api.py", line 201, in dispatch
    raise exc
api.bitmax_api.BitmaxWebSocket.WSClosed: Dispatch: WebSocket apparently closed
WSMessage(type=<WSMsgType.CLOSING: 256>, data=None, extra=None)

  

Я пытаюсь поймать исключение, чтобы продолжить программу, но оно получает исключение и перестает работать.

Ответ №1:

raise exc в except предложении повторно вызывает исключение. Вы хотели включить его?

Комментарии:

1. ДА. Это просто распространение исключения вверх.

2. Но программа не будет продолжена, если вы повторно вызовете исключение… @Mr .Danchik

3. Это обрабатывается в более высокой функции

4. Так что проблем быть не должно, но есть