Как останавить telegram бота (aiogram) при любой ошибке?
Telegram бот написан на python при помощи библиотеки aiogram. Есть необходимость останавливать самого бота и закрывать программу при возникновении ошибок, которые касаются непосредственно библиотеки aiogram.
В качестве примера ошибки можно рассмотреть (
или любую другую которая возникает внутри библиотеки aiogram):
aiogram.utils.exceptions.TerminatedByOtherGetUpdates: Terminated by other getupdates request; make sure that only one bot instance is running
Если вкратце вот код:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from config import TOKEN
if __name__ == '__main__':
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
executor.start_polling(dp)
Пробовал оборачивать executor.start_polling(dp) в конструкцию try, except. Однако это не помогло ибо ошибка возникала внутри executor.start_polling(dp) и тем самым не имела никакого влияния на try, except главной функции.
Что необходимо сделать для остановки бота в случаем ошибки и закрытием самой программы?
Ответы (1 шт):
Вы должны понимать, что говоря уже о любой ошибке можно говорить и о 100 ошибках возникших при работе с aiogram, так как никто не знает на сколько вы правильно пишите код и никто не знает с какой ошибкой вы можете столкнуться в процессе работы с библиотекой, поэтому если вы хотите обрабатывать все ошибки, читайте моё краткое руководство, которое я написал ниже.
Первым делом вам необходимо найти файл
exceptions.pyв папкеutilsсaiogram, сделать это можно просто, к примеру создать специально какую-либо ошибку в боте, вам отобразится путь, найдете этот путь либо просто перейдете по нему ( нажав на подобную строчку в VS Code или в ином редакторе, если там имеется такая возможность ), у меня этот путь:
C:\Users\Maxim\AppData\Local\Programs\Python\Python39\Lib\site-packages\aiogram\utils
Открываете файл
exceptions.pyзатем изменяете вашу функциюdetect, которая по умолчанию будет иметь такой код:
def detect(cls, description):
description = description.lower()
for err in cls.__subclasses:
if err is cls:
continue
if err.check(description):
raise err(cls.text or description)
raise cls(description)
Изменить свою функцию вы должны на этот код:
def detect(cls, description):
description = description.lower()
for err in cls.__subclasses:
if err is cls:
continue
if err.check(description):
os._exit(0)
raise err(cls.text or description)
os._exit(0)
raise cls(description)
Также не стоит забывать, что необходимо импортировать и сам
os,import os, для примера я решил написать такой вот код:
from aiogram import Bot, Dispatcher, executor
telegram_bot_token = 'YOUR TOKEN'
bot = Bot(token=telegram_bot_token)
dp = Dispatcher(bot)
@dp.message_handler(commands=['start'])
async def ff(message):
await message.answer(
text='' # для создания ошибки, здесь не должно быть текста
)
if __name__ == '__main__':
executor.start_polling(dp)
В итоге когда вы попытаетесь запустить код, через секунду у вас перестанет работать бот, так как произошла ошибка:
raise err(cls.text or description)
aiogram.utils.exceptions.MessageTextIsEmpty: Message text is empty
Однако от этого появляется один минус, так как вы не знаете где именно произошла ошибка и на какой строке она была допущена, поэтому вы можете дописать перед двумя
os._exit(0)вот эту строкуprint(cls.text or description), так вы и сможете понять с чем была связана ошибка и почему ваш код / бот перестал выполняться, дальше остается найти только саму строку и изменить её. В итоге ваша функцияdetectдолжна выглядеть следующим образом:
def detect(cls, description):
description = description.lower()
for err in cls.__subclasses:
if err is cls:
continue
if err.check(description):
print(cls.text or description)
os._exit(0)
raise err(cls.text or description)
print(cls.text or description)
os._exit(0)
raise cls(description)