Торнадо торнадо торнадо.iostream.StreamClosedError - PullRequest
0 голосов
/ 29 мая 2018

У меня есть обработчик веб-сокетов python tornado, который работает просто отлично.Тем не менее, время от времени, когда вкладка закрыта с подключением к websocket, он выдает исключения, которые я не могу поймать.Это происходит только с Firefox, поэтому я подозреваю, что это может быть внутренняя ошибка.Исключение не прерывает выполнение кода, но я все еще хочу иметь возможность перехватывать все исключения.

Исключения:

ОШИБКА: asyncio: исключение будущего никогда не получалось. Future: Traceback (большинствопоследний вызов последним): Файл "C: \ Users \ user \ Anaconda3 \ lib \ site" (C: \ Users \ user \ Anaconda3 \ lib \ site-packages \ tornado \ websocket.py ", строка 808)-packages \ tornado \ gen.py ", строка 1099, в run value = future.result () tornado.iostream.StreamClosedError: Поток закрыт

Во время обработки вышеупомянутого исключения произошло еще одно исключение:

Traceback (последний вызов был последним): файл "C: \ Users \ user \ Anaconda3 \ lib \ site-packages \ tornado \ gen.py", строка 1107, в запуске yielded = self.gen.throw (*exc_info) Файл "C: \ Users \ user \ Anaconda3 \ lib \ site-packages \ tornado \ websocket.py", строка 810, в оболочке поднятьВот код для функции on_message:

async def on_message(self, message):
    print(message)
    while True:
        try:
            #print('ws_connections: ', self.ws_connection, self.ws_connection.stream.socket)
            _fut = self.write_message(self.users[self].request_data())
        except tornado.iostream.StreamClosedError as e:
            print('StreamClosedError:', e)
            break
        except tornado.websocket.WebSocketClosedError as e:
            print('WebSocketClosedError:', e)
            break
        except KeyError as e:
            print('KeyError:', e)
            break
        await gen.sleep(1)

1 Ответ

0 голосов
/ 30 мая 2018

Я нашел ответ здесь: Поймать ошибки в asyncio.ensure_future .

async def on_message(self, message):
    print(message)
    while True:
        try:
            self.ping(b'ping')
            fut = self.write_message(self.users[self].request_data())
            await fut
        except tornado.iostream.StreamClosedError as e:
            print('StreamClosedError:', e)
            break
        except tornado.websocket.WebSocketClosedError as e:
            print('WebSocketClosedError:', self)
            break
        except KeyError as e:
            print('KeyError:', e)
            break
        await gen.sleep(5)

Мне просто нужно было добавить 'await fut' после того, как я вернул будущее из self.write_message.

...