python 如何修复“上述异常是以下异常的直接原因”错误[已关闭]

62lalag4  于 2023-04-10  发布在  Python
关注(0)|答案(2)|浏览(78)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
Improve this question
我正在做一个discord.py机器人,用一个简单的JSON数据库来描述国家。我在YouTube上看了一个教程(从2020年开始)来做到这一点:

import discord
from discord.ext import commands
import random
import json

client = commands.Bot(command_prefix=";", intents=discord.Intents.all())

@client.event

async def on_ready():
    print("Bot is online")

@client.command() 

async def spam(ctx):
    for x in range(5000):
        await ctx.send("IT'S SPAM TIME!")

@client.command()

async def info(ctx):
    a = await register_country(ctx.author)
    users = await data()
    name = users[str(ctx.author.id)]["name"]
    leader = users[str(ctx.author.id)]["leader"]
    em = discord.Embed(title=ctx.author.name+"'s balance")
    em.add_field(name = "Name: "+str(name))
    em.add_field(name = "Leader: "+str(leader))
    await ctx.send(embed = em)

    
async def register_country(user):
    users = await data()
    if str(user.id) in users:
        return False
    else:
        users[str(user.id)]["name"] = "Undefined"
        users[str(user.id)]["leader"] = "Undefined"
    
    with open("onu.json", "w") as f:
        json.dump(users, f)
    return True

async def data():
    with open("onu.json", "r") as f:
        users = json.load(f)
    return users


    
client.run("MT...")

但是,当我运行代码时,我得到了这个错误:
Output
我不知道是不是和某个版本有关,因为我看的制作代码的教程是2020年的

sigwle7e

sigwle7e1#

我相信错误是在 register_country 函数中。您正在访问一个不存在的字典键。如果您替换此部分

users[str(user.id)]["name"] = "Undefined"
users[str(user.id)]["leader"] = "Undefined"

users[str(user.id)] = {"name": "Undefined", "leader": "Undefined"}

应该可以

mjqavswn

mjqavswn2#

正如Hazzu所说,问题是字典键在字典中不存在的情况下被访问,可能是由于异步调用,为了防止这种情况,当试图从字典中获取键值时,应该始终使用dict.get(key, default_value)函数,字典可能有也可能没有该键(如异步调用):

>>> d = {"a": 10}
>>> d.get("b", 0)
0
>>> d.get("a", 0)
10

在这种情况下,如果值存在,函数将返回该值,如果不存在,则返回默认参数,以防止程序引发异常。

相关问题