使用pyTelegramBotAPI在AWS ECS容器中遇连接中断异常求助
问题分析与解决方案
为什么加了外层异常捕获还会看到错误日志?
你看到的Infinity polling exception是pyTelegramBotAPI内部打印的日志,而非未被捕获的异常。因为你设置了none_stop=True,infinity_polling方法内部会自动捕获异常并重启轮询,同时把错误信息打印出来——这个过程不会让方法退出,所以你的外层try-except根本触发不到。
解决方法
1. 屏蔽pyTelegramBotAPI的内部错误日志
如果只是不想看到这些日志,可以通过Python的logging模块调整TeleBot的日志级别,只让它输出警告及以上的信息:
import logging from telebot import logger as telebot_logger # 把TeleBot的日志级别设为WARNING,屏蔽INFO和DEBUG级别的错误日志 telebot_logger.setLevel(logging.WARNING)
2. 手动实现轮询循环,完全控制异常处理
放弃infinity_polling,直接用bot.polling()自己写循环,这样所有异常都能被你自己的逻辑捕获,避免内部日志干扰:
import time import telebot bot = telebot.TeleBot("YOUR_TOKEN") # 这里写你的bot handler,比如@bot.message_handler(...) while True: try: print("Starting polling...") bot.polling( timeout=30, long_polling_timeout=30, allowed_updates=["message", "callback_query"] # 只监听需要的更新类型,减少请求量 ) except Exception as e: print(f"Polling failed with error: {e}") time.sleep(10) # 出错后等待10秒再重试
3. 优化轮询参数与网络配置
- 调整
timeout和long_polling_timeout:太长的超时时间更容易遇到连接断开,建议设为30秒以内。 - 指定
allowed_updates:只监听你的机器人需要处理的更新类型(比如消息、回调查询),减少每次请求的数据量,降低连接异常概率。 - 检查ECS网络:确保容器所在的安全组允许出站访问
api.telegram.org:443,同时确认NAT网关/网络链路稳定——AWS ECS偶尔的网络波动也可能导致这类连接断开问题。
内容的提问来源于stack exchange,提问作者Betelgeitze
相关产品推荐
相关产品推荐

