如何让代码错误显示在终端?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
相关产品推荐
相关产品推荐

