#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. Так что проблем быть не должно, но есть