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
相关产品推荐
相关产品推荐

