Heroku部署python-telegram-bot的/reputation命令报错排查
问题排查结果
1. 不带参数调用报错local variable 'f' referenced before assignment原因
仅在带参数的if context.args != []分支中执行了f = open("reputation.json", "r")给变量f赋值,当走不带参数的elif context.args == []分支时,代码直接调用json.load(f),此时f没有被定义,直接触发变量未赋值报错。
2. 带参数调用报错Expecting ',' delimiter: line 3 column 2 (char 21)原因
这个是JSON解析错误,触发原因有两个:
- 文件名拼写不一致:项目目录里存储的文件是
reptation.json,但代码里读取的是reputation.json,多了一个字母u,导致读取的是空文件/不存在的文件,JSON解析失败 - 初始
reputation.json格式不符合JSON规范,存在语法错误,比如少逗号、引号不闭合等
其他隐藏bug
- 声望数值修改逻辑无效:将
reputationDict[target]赋值给局部变量amountTarget后修改,不会同步修改原字典reputationDict里的值,最终写入JSON文件的还是原始数据,修改不会生效 - 数值类型错误:从
context.args取到的amount是字符串类型,直接执行加减运算会触发类型错误,需要先转成int类型 parseReputationMessage函数语法错误:字典的keys()、values()是方法,必须加括号调用,且不能直接用下标取值,需要先转成列表,同时直接写死取前5个key的逻辑,如果字典元素不足5个会直接报错- Heroku临时文件系统特性限制:Heroku每次重新部署、dyno重启时都会清空本地文件,存储在
reputation.json里的数据会定期丢失,无法持久化存储
内容的提问来源于stack exchange,提问作者LOLOOLOLOLOLO
相关产品推荐
相关产品推荐

