Python Telegram bot - 运行几个小时后的KeyError

时间:2017-12-15 20:11:21

标签: python bots telegram keyerror

我在Python中编写了一个Telegram bot,它运行在我的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')

2 个答案:

答案 0 :(得分:1)

错误表示text dict中没有msg个密钥。也许这是一些没有文本的特殊电报消息,或者在某些情况下代码中存在删除text密钥的错误。你可以用

command = msg.get('text')

在没有文字时获取None。或

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

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

您还可以检查textmsg是否inif 'text' not in msg: logger.error('bad message received!') return 运营商:

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

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

像在Python中一样,在任何错误后重启:

var count int64
db.Model(&models.User{}).Count(count)
fmt.Println(count)

我还建议记录Sentry等文件或服务中的错误,以调查之后没有文字的原因。

答案 1 :(得分:0)

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

因此,在您的情况下,msg字典没有密钥text

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