Discord.py: Кажется, моя программа не может различить ошибки (MissingPerms, BotMissingPerms) и поэтому использует неправильный обработчик - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь поймать некоторые ошибки, которые могут быть ошибочно выданы пользователями с помощью команды. Чтобы проверить это, я создал команду, которая вызывает ошибки по требованию, и функцию, которая должна их отлавливать. Проблема в том, что моя попытка поймать commands.BotMissingPermisions, commands.MissingPermissions и commands.CommandOnCooldown, похоже, игнорируется и обрабатывается как commands.CommandInvokeError. Другие ошибки, например TooManyArguments или NotOwner, ловятся очень хорошо.

вот мой код:

Import discord
from discord.ext Import commands

bot = commands.Bot(command_prefix='~')

@bot.event
async def on_command_error(ctx, error):
  if isinstance(error, commands.MissingPermissions):
    await ctx.send('missing perms')
  elif isinstance(error, commands.BotMissingPermissions):
    await ctx.send('bot missing perms')
  elif isinstance(error, commands.CommandOnCooldown):
    await ctx.send('cooldown')
  elif isinstance(error, commands.CommandInvokeError):
    await ctx.send('invoke')
  else:
    await ctx.send('should not happen')

@bot.command
async def doError(ctx, type : int):
  if(type == 0):
    raise commands.MissingPermissions
  elif(type == 1):
    raise commands.BotMissingPermissions
  elif(type == 2):
    raise commands.CommandOnCooldown

bot.run(token)

Я впервые задаю здесь вопрос, поэтому, пожалуйста, дайте мне знать, если вам нужно больше информации

1 Ответ

1 голос
/ 09 января 2020

Ошибки команды, которые вы пытаетесь перехватить, должны быть вызваны до выполнения обратного вызова для команды (из проверок, преобразователей и т. Д. c). Исключения, возникающие при обратном вызове, будут заключены в CommandInvokeError, поэтому понятно, откуда они берутся.

Например, у вас может быть обработчик ошибок, например

@bot.event
async def on_command_error(ctx, error):
  if isinstance(error, commands.TooManyArguments):
    await ctx.send('too many arguments')
  elif isinstance(error, commands.CommandInvokeError):
    await ctx.send('invoke')
  else:
    await ctx.send('should not happen')

и команда типа

@bot.command
async def doError(ctx, type : int):
  raise commands.TooManyArguments

Если вы фактически передаете слишком много аргументов команде, то механизмы обработки команд сгенерируют исключение TooManyArguments и передадут его обработчику. С другой стороны, если ваш обратный вызов выдаст исключение TooManyArguments, то механизм команд примет это исключение, обернет его в CommandInvokeError и передаст его обработчику.

...