Неуловимая ошибка прерывает цикл "aiogram.utils.exceptions.NetworkError" (while, loop, телеграм бот)
Имеется телеграм-бот на aiogram (2.19).
# ... пропущен код ...
async def current_info(message: types.Message, state: FSMContext):
current_data = {}
while True:
local_file = open(json_file, 'r')
local_data = local_file.get('data')
if local_data and local_data != current_data:
current_data = local_data
await message.answer(str(current_data))
local_file.close()
await asyncio.sleep(10)
# ... пропущен код ...
def register_handlers(dp: Dispatcher):
# ... пропущен код ...
# InfoState.ok - состояние успешной авторизации
dp.register_message_handler(current_info, lambda message: message.text == "Начать
смотреть актуальные обновления", state=InfoState.ok)
# ... пропущен код ...
Выше представил упрощенную структуру. То есть есть корутина принимающая команду "Начать смотреть актуальные обновления" 1 раз - после чего начинающая бесконечные запросы в "json_file" на наличие чего-то нового и после отправки этого юзеру.
Все работает хорошо, за исключением одной вещи. Когда проскакивает:
aiogram.utils.exceptions.NetworkError
бот свою работу аварийно не завершает - он продолжает функционировать и отвечать на прямые запросы юзеров: "команда - запрос". Но с цикла while True вылетает. И самое худшее, что я не могу словить эту ошибку - и, например, вызвать сообщение юзеру, где он перезапустит цикл кнопкой "Начать смотреть актуальные обновления". Функция с while перезагружается, без перезапуска бота, без проблем. Проблема в том, что ты не можешь быть уверен случилась ли ошибка и пора перезапустить цикл, или просто нет новый данных в json_file
Желаемый результат для меня - отлавливание этой ошибки для дальнейшего перезапуска цикла while True, но не всего бота полностью.
Попытки обернуть try except мой if __name__ == '__main__': asyncio.run(main()) и await message.answer, все тело while ни к чему не привели. Ошибка происходит вне моего кода, но ломает цикл в моем коде.
Заранее прошу прощения за глупость, и большое спасибо за любые Ваши ответы и подсказки!
Ответы (1 шт):
Есть вариант, сделать синхронность, приведу пример...
from threading import Thread
def thisisfunc():
while(True):
print('world')
thread1 = Thread(target=thisisfunc())
thread1.start()
thread1.join()
думаю поможет...
