【问题标题】:Python Telegram bot - KeyError after running for a few hoursPython Telegram bot - 运行几个小时后出现 KeyError
【发布时间】:2017-12-18 21:23:58
【问题描述】:

我用 Python 编写了一个 Telegram 机器人,它在我的 Raspberry Pi (Raspbian) 上运行。在机器人运行了几个小时后,我最终看到了一个错误。

在我发布完整代码之前,有人可以帮我理解错误吗?在我需要重新启动它之前,我想无限期地运行该机器人,或者至少运行几天。

错误如下:

Traceback (most recent call last):
  File "/home/pi/Schreibtisch/StreamrPreisBot/telepot/loop.py", line 37, in run_forever
    self._handle(msg)
  File "/home/pi/Schreibtisch/StreamrPreisBot/streamrinfobot.py", line 32, in handle
    command = msg['text']
KeyError: 'text'

编辑: 使用以下代码:

def handle(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

这段代码能解决问题吗?

def handle(msg):
    chat_id = msg['chat']['id']
    command = msg.get('text')

【问题讨论】:

  • 您还应该发布产生此错误的代码。
  • 如果您至少在loop.py 中发布_handle(msg) 的代码,我很乐意帮助您找出错误原因。

标签: python bots telegram keyerror


【解决方案1】:

错误提示 text 字典中没有 text 键。也许是一些没有文本的特殊电报消息,或者在某些情况下,您的代码中存在删除 text 键的错误。你可以使用

command = msg.get('text')

在没有文本时获取None。或者

command = msg.get('text', '')

在没有文本时获取空字符串(即'')。

您还可以使用in 运算符检查msg 内部是否存在text:

if 'text' not in msg:
    logger.error('bad message received!')
    return

如果您希望您的服务始终处于运行状态,您应该添加一些自动重启机制。

喜欢在 Python 中出现任何错误后重新启动:

while True:
    try:
        logger.info("Starting bot")
        run_bot()
    except Exception:
        logger.exception("Something bad happened. Restarting")

我还建议在文件或服务中记录错误,例如 Sentry,以调查为什么之后没有文本。

【讨论】:

    【解决方案2】:

    当从 dict 请求值但字典中不存在该键时,将引发 KeyError。

    因此,在您的情况下,msg 字典没有键 text。

    您应该检查您的代码以确保msg 字典包含与键text 关联的值。或者,如果您希望 msg 有时不包含键 text,则应改为使用 get 方法访问字典,该方法永远不会引发 KeyError。请参阅the docs 了解更多信息。

    【讨论】:

    • @SurvivorX 在决定使用get 方法之前,您需要确定字典为什么不包含text 键。如果您希望它始终包含 text 键,那么您的错误实际上在其他地方。它恰好以这种方式显现。那么,请告诉我,您希望text 键始终在那里吗?
    • 既然机器人有权读取它使用的组中的每条消息,我猜实际上应该始终给出文本键
    • @SurvivorX 我明白了。因此,听起来您的错误的来源在其他地方。因此,我暂时避免使用get 方法,因为它会使异常静音。相反,尝试追查text 键在msg 中不存在的原因。
    • 实际上程序运行得非常好,它只是给我这个错误(多次),运行几个小时后,变得越来越慢。如果消除此错误有帮助,那已经足够了。我会让它运行并明天检查它并在这里回复它是如何工作的。谢谢!
    • @SurvivorX 运气好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多