0
votes

Comment gérer les erreurs `MissingRequiredArgument`

Je faisais un bot dans la branche de réécriture de discord.py et disons que c'est mon code:

Ignoring exception in command translate:
Traceback (most recent call last):
  File "C:\Users\jatinder\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\bot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\jatinder\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 790, in invoke
    await self.prepare(ctx)
  File "C:\Users\jatinder\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 751, in prepare
    await self._parse_arguments(ctx)
  File "C:\Users\jatinder\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 679, in _parse_arguments
    kwargs[name] = await self.transform(ctx, param)
  File "C:\Users\jatinder\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 516, in transform
    raise MissingRequiredArgument(param)
discord.ext.commands.errors.MissingRequiredArgument: con is a required argument that is missing.

Ce que j'essaie de faire est de gérer l'erreur MissingRequiredArgument mais le code est écrit donne toujours l'erreur au lieu de renvoyer Vous ne m'avez rien donné à répéter! J'apprécierais que quelqu'un me dise comment le gérer. erreur exacte:

@bot.command()
async def ok(ctx,con):
    try:
        await ctx.send(con)
    except commands.MissingRequiredArgument:
        await ctx.send('You did not give me anything to repeat!')


5 commentaires

En regardant l'exception écrite sur le dépôt discord.py lui-même, il semble que MissingRequiredArgument n'est qu'une exception qui se produit lorsque vous ne passez pas l'argument requis, et la méthode ctx.send () a un argument. Avez-vous essayé d'utiliser await ctx.send (con) sans aucune instruction try / except et ce qu'elle dit en cas d'erreur?


@ lambda23 Je l'ai essayé mais il a juste donné la même erreur


Quelle est l'erreur exacte (trace de pile)? Vous pouvez également inclure la version discord.py et vérifier s'il s'agit d'un problème (en cours) sur leur dépôt GitHub.


@ lambda23 l'a ajouté et je vais vérifier leur github


Une note de votre code d'origine. Vous pouvez probablement simplement envoyer le message Discord si con est un None au lieu de l'envelopper de cette manière. Il vaut mieux éviter que la méthode renvoie une erreur au lieu de la laisser lancer une erreur. De plus, je pense que con est le premier argument au lieu du tableau d'arguments de la commande, vous pouvez utiliser * args comme deuxième paramètre de votre méthode. De cette façon, vous utiliserez vos arguments comme un tableau et vous pourrez vérifier si votre premier argument ( args [0] ) est None, puis vous enverrez le message.


3 Réponses :


0
votes

La meilleure façon de procéder serait d'utiliser l'événement d'erreur.

@ok.error
async def on_command_error(error, ctx):
    await ctx.send(“You did not give me anything to repeat!”)

Veuillez noter que @ ok.error est intentionnel car il ne l'autorise qu'à fonction pour cette commande afin de ne pas interférer avec toutes les autres commandes que vous avez.


2 commentaires

Les commandes n'ont pas l'attribut «événement». Je pense donc que @ ok.event ne fonctionnera pas. Peut-être vouliez-vous dire @ ok.error ?


Je l'ai fait, mon erreur!



0
votes

Je ne suis pas sûr que l'autre réponse fonctionnera, mais cela fonctionnera

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, MissingRequiredArgument):
        await ctx.send("A parameter is missing") 


0 commentaires

0
votes

Cette erreur ne peut pas être gérée par un try / sauf, je ne sais pas pourquoi, mais j'ai deux façons de gérer cela.

Première méthode:


@bot.command()
async def ok(ctx, con):
    # Do whatever here, if you come here it means the user gave something to repeat

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.MissingRequiredArgument):
        print('You did not give me anything to repeat!')


1 commentaires

De plus, si vous utilisez @ ok.error , vous pouvez nommer on_command_error ce que vous voulez