如何解决在电报机器人的作业执行中捕获异常
我正在编写一个将消息发送到电报用户列表的方法。
我正在将其创建为每天早上 8:30 运行并发送“早上好消息”的作业。
@catch_exceptions(cancel_on_failure=True)
async def send_message():
message = 'Good Morning'
list_of_user_to_send_message = bot_team_data() # method to fetch data from DB
if type(list_of_user_to_send_message) is not list:
return
for telegramId in list_of_user_to_send_message:
if type(telegramId) is not int:
user = int(telegramId)
logger.info('Good morning message sent to {user}'.format(user=telegramId))
try:
await bot.send_message(user,message)
except ValueError as e:
logger.exception(
'User with telegramId {id} is not interacted with the bot,{e}'.format(id=telegramId,e=e),stack_info=True)
continue
except Exception as e:
logger.exception(
'Error occurred for the telegramId {id} and the error is {e}'.format(id=telegramId,stack_info=True)
continue
我正在使用 aioschedule 包将该方法作为作业运行。
我还创建了一个方法来捕获任何未知异常并取消作业。
但它无法工作。
下面的代码是我如何实现捕获异常。
import functools
import aioschedule as schedule
import asyncio
def catch_exceptions(cancel_on_failure=False):
def catch_exceptions_decorator(job_func):
@functools.wraps(job_func)
def wrapper(*args,**kwargs):
try:
return job_func(*args,**kwargs)
except:
import traceback
if cancel_on_failure:
return schedule.CancelJob
return wrapper
return catch_exceptions_decorator
def main():
bot.start()
schedule.every().day.at("10:00").do(send_message)
loop = asyncio.get_event_loop()
while True:
loop.run_until_complete(schedule.run_pending())
bot.run_until_disconnected()
if __name__ == '__main__':
main()
import configparser
import functools
import aioschedule as schedule
import asyncio
from telethon import TelegramClient
parser = configparser.ConfigParser()
parser.read("../application.yml")
api_id = parser.get("telegram-config","api_id")
api_hash = parser.get("telegram-config","api_hash")
bot_token = parser.get("telegram-config","bot_token")
bot = TelegramClient('session',api_id,api_hash).start(bot_token=bot_token)
def catch_exceptions(cancel_on_failure=False):
print('try 1')
def catch_exceptions_decorator(job_func):
print('try 2')
@functools.wraps(job_func)
def wrapper(*args,**kwargs):
try:
print('try 3')
return job_func(*args,**kwargs)
except Exception as e:
print('exception')
import traceback
if cancel_on_failure:
return schedule.CancelJob
return wrapper
return catch_exceptions_decorator
@catch_exceptions(cancel_on_failure=True)
async def send_message():
message = 'Good Morning'
print('send message')
await bot.send_message('1234',message)
def main():
bot.start()
schedule.every().day.at("10:00").do(send_message)
loop = asyncio.get_event_loop()
while True:
loop.run_until_complete(schedule.run_pending())
bot.run_until_disconnected()
if __name__ == '__main__':
main()
输出:
try 1
try 2
try 3
send message
Task exception was never retrieved
future: <Task finished name='Task-115736' coro=<Job.run() done,defined at D:\Project\telegram_bot\venv\lib\site-packages\aioschedule\__init__.py:455> exception=ValueError('Cannot get entity by phone number as a bot (try using integer IDs,not strings)')>
Traceback (most recent call last):
File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 501,in _get_entity_from_string
for user in (await self(
File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 30,in __call__
return await self._call(self._sender,request,ordered=ordered)
File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 77,in _call
result = await future
telethon.errors.rpcerrorlist.BotMethodInvalidError: The API access for bot users is restricted. The method you tried to invoke cannot be executed as a bot (caused by GetContactsRequest)
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
File "D:\Project\telegram_bot\venv\lib\site-packages\aioschedule\__init__.py",line 462,in run
ret = await self.job_func()
File "D:/Project/telegram_bot/src/try_exception_catch.py",line 64,in send_message
await bot.send_message('1234',message)
File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\messages.py",line 697,in send_message
entity = await self.get_input_entity(entity)
File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 413,in get_input_entity
await self._get_entity_from_string(peer))
File "D:\Project\telegram_bot\venv\lib\site-packages\telethon\client\users.py",line 506,in _get_entity_from_string
raise ValueError('Cannot get entity by phone number as a '
ValueError: Cannot get entity by phone number as a bot (try using integer IDs,not strings)
try 3
send message
Task exception was never retrieved
future: <Task finished name='Task-115738' coro=<Job.run() done,in _get_entity_from_string
for user in (await self(
File "D:\Project\telegram_botvenv\lib\site-packages\telethon\client\users.py",not strings)
终端中不断出现值错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。