Discord.js中Unban命令Try Catch未生效,触发DiscordAPIError[10026]
问题分析与解决
你的unban命令里try/catch不触发的核心原因是:interaction.guild.members.unban(user)是异步方法,它返回一个Promise,但你没有用await等待它完成,导致异步操作的错误无法被同步的try/catch捕获,错误会变成未处理的Promise拒绝,而不是进入catch块。
修复步骤
- 在
unban调用前添加await关键字,让异步操作的错误能被try/catch捕获 - 修正代码里的拼写错误:
spesified改为specified(不影响功能,但更规范) - 补全缺失的
SlashCommandBuilder导入,原代码未显式导入该类
修改后的完整代码
const { Console } = require('console'); const fs = require('fs'); const { EmbedBuilder, SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('unban') .setDescription('Unbans the specified user.') .addUserOption(option => option .setName('target') .setDescription('The user to unban.') .setRequired(true)), async execute(interaction) { let is_admin = false; const server_data_path = `./data/${interaction.guild.id}.json`; if (fs.existsSync(server_data_path)) { const rawdata = fs.readFileSync(server_data_path); const server_data = JSON.parse(rawdata); const sender_id = interaction.user.id; if(server_data.admin.includes(sender_id)){ is_admin = true; } } if(is_admin){ const user = interaction.options.getUser('target').id; try{ await interaction.guild.members.unban(user); const success_embed = new EmbedBuilder() .setColor('00ff00') .setTitle(`Unbanned: ${user}.`); await interaction.reply({ embeds: [success_embed] }); setTimeout(() => interaction.deleteReply(), 5000); }catch (error){ console.error(error); const error_embed = new EmbedBuilder() .setColor('ff0000') .setTitle("Could not unban the target.") .setDescription(`Error: ${error.message}`); await interaction.reply({ embeds: [error_embed], ephemeral: true }); setTimeout(() => interaction.deleteReply(), 5000); } }else{ const error_embed = new EmbedBuilder() .setColor('ff0000') .setTitle("You must be an admin to use this command."); await interaction.reply({ embeds: [error_embed], ephemeral: true }); setTimeout(() => interaction.deleteReply(), 5000); } }, };
额外优化点
- 给未声明的
is_admin添加let声明,避免全局变量污染 - 用模板字符串替代字符串拼接,代码更简洁易读
- 在catch块打印错误到控制台,方便调试问题
- 给错误回复添加
ephemeral: true,仅命令执行者可见,减少频道干扰 - 给
interaction.reply添加await,确保回复完成后再执行删除操作
内容的提问来源于stack exchange,提问作者user18339230
相关产品推荐
相关产品推荐

