Cómo manejar errores TypeError con discord.py

CorePress2024-01-24  9

Estoy aprendiendo a crear un bot de Discord con discord.py y, cada vez que me equivoco en el código, a veces aparece el mensaje "TypeError". error.

Por ejemplo

@bot.command()
async def compress(ctx):
    directory = '/pictures/'
    picture = '83680009_p0.png'
    path = directory+picture
    img = Image.open(path)
    img.save(path, optimize=True, quality = 85)
    img.save()

Hay un error en ese código y el error está en la línea directorio = '/pictures/'. No debería haber una barra invertida antes de "imágenes/". Entonces, cuando intenté ejecutar el comando comprimir recibí el error

TypeError: on_command_error() missing 1 required positional argument: 'error'

¿Hay alguna manera de manejar el error y enviar un mensaje con el bot cada vez que ocurre este error? Gracias. Por cierto, esta es la primera vez que hago una pregunta, así que díganme si me falta algo.



------------------------------------

Como el errorComo dije, a su on_command_error le falta un argumento. Realmente no has proporcionado el código, pero la forma correcta debería ser:

@bot.event
async def on_command_error(ctx, error):
    ...

Además, el controlador de errores solo maneja errores de discord.py, no NameError, AttributeError... Para manejarlos, debes usar un bloque try/except simple.

Manejo de operaciones "normales" errores en el manejador de errores

@bot.event
async def on_command_error(ctx, error):
    # If an error happens inside the command,
    # discord.py wraps it around with `commands.CommandInvokeError` 
    # which has the `original` attribute which is the "original" error
    error = getattr(error, "original", error)
    if isinstance(error, TypeError):
        ...
    elif isinstance(error, commands.MissingPermissions):
        ...
    # And so on...

Sin embargo, no recomendaría esto, un comando debe codificarse de tal manera que nunca arroje errores como estos.

1

Gracias por la respuesta, accidentalmenteTally usó a sí mismo como argumento cuando no estaba en un engranaje. ¿Hay alguna manera de manejar TypeError, NameError, etc., como cómo se manejan los errores de discord.py? No quiero escribir un bloque try/except para cada uno de mis comandos sólo porque es probable que haya introducido un error allí.

- oso

27/03/2021 a las 20:28



------------------------------------

Dice que a la función le falta un argumento 'error'. Para solucionarlo:

@bot.event
async def  on_command_error(ctx, error):

Si estás dentro de un engranaje,

@commands.Cog.listener()
async def on_command_error(self, ctx, error):

2

Gracias por la respuesta. Usé self como argumento en la función on_command_error pero no estaba en ningún engranaje.

- oso

27/03/2021 a las 20:29

Si no está dentro de una clase o un engranaje, no lo agregues.

- StatTrakDiamondSword

28/03/2021 a las 14:38

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare