You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让代码错误显示在终端?Discord警告机器人代码故障求助

Discord警告机器人无报错但无法运行的问题修复及错误输出配置

一、让错误输出到终端的方法

discord.py 默认会捕获部分异常,你可以通过添加全局异常处理事件强制输出所有错误到终端:

import traceback
from discord.ext import commands

# 处理命令执行错误
@client.event
async def on_command_error(ctx, error):
    print(f"命令[{ctx.command}]执行错误: {str(error)}")
    # 可选:将错误发送到频道,方便调试
    await ctx.send(f"命令执行失败: {str(error)}")

# 处理客户端全局事件错误
@client.event
async def on_error(event_name, *args, **kwargs):
    print(f"事件[{event_name}]触发错误:")
    traceback.print_exc()

同时确保直接在终端运行机器人,不要用输出重定向或后台运行工具(如nohup)屏蔽终端输出。

二、代码中的关键问题修复

1. 变量名不一致问题

代码中混用bot和client两个变量(如遍历服务器时用bot.guilds,但赋值用client.warnings),必须统一使用同一个变量名,例如全部改为client。

2. 服务器数据初始化逻辑错误

原代码的文件读取逻辑存在多个问题,需调整到on_ready事件中执行(异步代码不能放在全局作用域),并修正数据解析逻辑:

@client.event
async def on_ready():
    client.warnings = {}  # 初始化警告存储字典
    for guild in client.guilds:
        # 确保服务器文件存在
        async with aiofiles.open(f"{guild.id}.txt", mode="a") as temp:
            pass
        client.warnings[guild.id] = {}
        
        # 读取已有警告数据
        async with aiofiles.open(f"{guild.id}.txt", mode="r") as file:
            lines = await file.readlines()
            for line in lines:
                line = line.strip()
                if not line:
                    continue
                # 按空格拆分前两段,避免原因中的空格被拆分
                data = line.split(" ", 2)
                if len(data) < 3:
                    continue
                member_id = int(data[0])
                admin_id = int(data[1])  # 原代码错误使用了data[0]
                reason = data[2].strip("\n")
                
                # 初始化用户警告数据(如果不存在)
                if member_id not in client.warnings[guild.id]:
                    client.warnings[guild.id][member_id] = [0, []]
                client.warnings[guild.id][member_id][0] += 1
                # append只能传一个参数,用元组包裹管理员ID和原因
                client.warnings[guild.id][member_id][1].append((admin_id, reason))

3. warning命令逻辑错误

原代码仅在首次警告时发送Embed,需将发送逻辑移到try-except外部,确保所有警告都能触发消息:

@client.command()
@commands.has_permissions(kick_members=True)
async def warning(ctx, member: discord.Member, *, reason="Aucune raison n'a été donné"):
    await ctx.message.delete()
    try:
        client.warnings[ctx.guild.id][member.id][0] += 1
        client.warnings[ctx.guild.id][member.id][1].append((ctx.author.id, reason))
    except KeyError:
        client.warnings[ctx.guild.id][member.id] = [1, [(ctx.author.id, reason)]]
    
    # 统一发送警告Embed
    count = client.warnings[ctx.guild.id][member.id][0]
    embed = discord.Embed(title="**Nombre de warn**", description="Un modérateur a frappé !", color=0xfa8072)
    embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url)
    embed.set_thumbnail(url="https://cdn3.emoji.gg/emojis/3968-discord-banhammer.png")
    embed.add_field(name="Membre", value=member.mention, inline=True)
    embed.add_field(name="Nombre de warn", value=count, inline=True)
    embed.add_field(name="Modérateur", value=ctx.author.name, inline=True)
    embed.set_footer(text=funFact)  # 确保funFact变量已提前定义
    await ctx.send(embed=embed)

4. 缩进与注册问题

确保on_guild_join事件和命令装饰器是全局级别的,不要缩进在其他代码块内,否则无法被客户端注册:

@client.event
async def on_guild_join(guild):
    client.warnings[guild.id] = {}

5. 必要导入检查

确保已导入所有依赖模块:

import discord
from discord.ext import commands
import aiofiles

内容的提问来源于stack exchange,提问作者user20315684

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:45:36