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

discord.js无法捕获403 Missing Permission错误导致机器人离线问题

错误原因

message.guild.members.ban() 是异步方法,返回Promise对象,你的代码没有添加await关键字触发等待逻辑。try-catch仅能捕获同步代码抛出的错误,或是await关键字修饰的异步方法抛出的reject错误,未被await的Promise抛出的错误会被判定为未处理的Promise拒绝,直接导致进程崩溃,不会进入你写的catch分支。

修复后的代码
module.exports = new Command({
name: 'ban',
usage: 'ban <member>',
description: 'Bans a member from the server.',
permission: "BAN_MEMBERS",
async run(message, args, client) {
    const member = message.mentions.users.first()

    if (!member) {
        return message.channel.send("A member argument must be given. Example: `ban [@member]`");
    }

    // 校验命令发起者的封禁权限,对应你原来写的无效else分支的逻辑
    if (!message.member.permissions.has("BAN_MEMBERS")) {
        return message.channel.send(`You do not have permissions to ban ${member.username}`);
    }

    try {
        // 添加await等待异步封禁操作执行完成
        await message.guild.members.ban(member)
        message.channel.send(`${member.tag} was banned!`);
    } catch (err) {
        // 可打印错误日志方便排查其他异常场景
        console.error('Ban error: ', err)
        message.channel.send(`I do not have permissions to ban ${member.username}`);
    }
}
})
额外优化点
  • 你原代码的最后一个else分支完全无效,因为前面已经通过if (!member) return的逻辑拦截了member为空的场景,该分支永远不会被触发,修复代码中已经将该分支的用户权限校验逻辑移到了正确位置
  • 可以在catch块中新增错误类型判断,区分权限不足、目标用户角色等级高于机器人、目标是服务器所有者等不同异常场景,返回更精准的提示信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:21:01