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

如何让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 });
        }
    }
};

关键修改说明

  1. 前置校验拦截:

    • 提前检查发起者、目标的权限和角色等级,在调用API前就拦截无效操作,减少不必要的错误请求。
    • 直接判断目标是否为机器人自身,避免触发API报错。
  2. 错误捕获与处理:

    • 用try-catch包裹核心的封禁操作,捕获所有异步执行中的错误,避免未处理的Promise拒绝导致机器人崩溃。
    • 根据Discord API返回的错误码,返回更精准的提示,同时保留兜底消息。
  3. 临时消息配置:

    • 所有错误提示都设置ephemeral: true,确保只有发起命令的用户能看到,不会在频道中公开显示。
  4. 崩溃防护:

    • 捕获错误后仅记录日志,不再抛出异常,保证机器人进程持续运行。

原错误处理无效的原因

原代码大概率没有用try-catch包裹异步的封禁操作,或者未正确捕获Discord API返回的权限错误。Discord.js的异步操作若未被捕获,会触发未处理的Promise拒绝,直接导致机器人进程崩溃。通过try-catch捕获后,错误被内部消化,不会扩散到进程层面。

内容的提问来源于stack exchange,提问作者average discord bot maker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:37:06