我在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')
答案 0 :(得分:1)
错误表示text
dict中没有msg
个密钥。也许这是一些没有文本的特殊电报消息,或者在某些情况下代码中存在删除text
密钥的错误。你可以用
command = msg.get('text')
在没有文字时获取None
。或
command = msg.get('text', '')
在没有文字时获取空字符串(即''
)。
您还可以检查text
内msg
是否in
与if '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。