如何让Discord机器人遇错时发送ephemeral消息而非控制台报错?
解决Discord机器人Ban命令权限错误的问题
修改后的完整代码(以discord.js v14为例)
const { SlashCommandBuilder, PermissionsBitField, EmbedBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('ban') .setDescription('封禁指定成员') .addUserOption(option => option.setName('目标') .setDescription('要封禁的成员') .setRequired(true)) .addStringOption(option => option.setName('理由') .setDescription('封禁理由') .setRequired(false)), async execute(interaction) { // 检查发起者权限 if (!interaction.member.permissions.has(PermissionsBitField.Flags.BanMembers)) { return interaction.reply({ content: '你没有权限执行封禁操作!', ephemeral: true }); } const targetUser = interaction.options.getUser('目标'); const reason = interaction.options.getString('理由') || '无理由'; const targetMember = await interaction.guild.members.fetch(targetUser.id).catch(err => null); // 拦截封禁自身的情况 if (targetUser.id === interaction.client.user.id) { return interaction.reply({ content: '抱歉,我不能封禁我自己!', ephemeral: true }); } // 提前校验目标权限等级 if (targetMember) { // 目标是管理员直接拦截 if (targetMember.permissions.has(PermissionsBitField.Flags.Administrator)) { return interaction.reply({ content: '抱歉,无法封禁管理员成员!', ephemeral: true }); } const botMember = interaction.guild.members.me; // 目标角色等级高于/等于机器人时拦截 if (targetMember.roles.highest.position >= botMember.roles.highest.position) { return interaction.reply({ content: '抱歉,目标成员的权限高于或等于我,无法执行封禁!', ephemeral: true }); } // 非服务器所有者无法封禁权限更高的成员 if (targetMember.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { return interaction.reply({ content: '抱歉,你无法封禁权限比你高的成员!', ephemeral: true }); } } // 执行封禁并捕获错误 try { await interaction.guild.members.ban(targetUser.id, { reason: reason }); // 封禁成功反馈 const embed = new EmbedBuilder() .setColor('#ff0000') .setTitle('成员已封禁') .addFields( { name: '目标成员', value: `${targetUser.tag} (${targetUser.id})` }, { name: '执行人员', value: `${interaction.user.tag} (${interaction.user.id})` }, { name: '封禁理由', value: reason } ) .setTimestamp(); await interaction.reply({ embeds: [embed] }); } catch (error) { // 记录错误但不崩溃 console.error('封禁操作出错:', error); // 根据API错误码返回对应提示 let errorMsg = '抱歉,无法执行该操作'; if (error.code === 50013) { errorMsg = '抱歉,我没有足够的权限执行封禁操作!'; } else if (error.code === 10013) { errorMsg = '抱歉,该成员不在此服务器中!'; } await interaction.reply({ content: errorMsg, ephemeral: true }); } } };
关键修改说明
前置校验拦截:
- 提前检查发起者、目标的权限和角色等级,在调用API前就拦截无效操作,减少不必要的错误请求。
- 直接判断目标是否为机器人自身,避免触发API报错。
错误捕获与处理:
- 用
try-catch包裹核心的封禁操作,捕获所有异步执行中的错误,避免未处理的Promise拒绝导致机器人崩溃。 - 根据Discord API返回的错误码,返回更精准的提示,同时保留兜底消息。
- 用
临时消息配置:
- 所有错误提示都设置
ephemeral: true,确保只有发起命令的用户能看到,不会在频道中公开显示。
- 所有错误提示都设置
崩溃防护:
- 捕获错误后仅记录日志,不再抛出异常,保证机器人进程持续运行。
原错误处理无效的原因
原代码大概率没有用try-catch包裹异步的封禁操作,或者未正确捕获Discord API返回的权限错误。Discord.js的异步操作若未被捕获,会触发未处理的Promise拒绝,直接导致机器人进程崩溃。通过try-catch捕获后,错误被内部消化,不会扩散到进程层面。
内容的提问来源于stack exchange,提问作者average discord bot maker
相关产品推荐
相关产品推荐

