Как обработать подобную ошибку в комманде бота на discord.py

Есть команда, в качестве аргумента функции которой передается число сообщений, необходимых для очистки, как я могу обработать ошибку при передаче параметра неверного типа, например при вводе команды !clear @User? Пробовал так, не канает:

@Bot.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def clear(ctx, amount = 10):
    try:
        if amount <= 10:
            now = "Done"
        elif amount <= 50:
            now = "Thats all?"
        elif amount >= 90:
            now = "Big clear, buddy"
        elif amount >= 50:
            now = "Good cleaning"
        cln = discord.Embed(title = f'Messages cleared: {amount}. {now}', color= 0xFF3861)
        await ctx.channel.purge(limit = amount)
        await ctx.send(embed = cln)
    except:
        print("Do something")

Ответы (2 шт):

Автор решения: Евгений

Ошибка возникает из-за того, что discord.py видит, что стандартное значение для amount - целое число, и самостоятельно, без каких-либо предупреждений пытается конвертировать любой аргумент в целое число ещё до начала выполнения тела функции. Решение - задавать значение по умолчанию в качестве числа уже внутри тела функции:

@Bot.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def clear(ctx, amount = None):
    if amount is None:
        amount = 10
    try:
        amount = int(amount)
    except Exception:
        pass # do something
    else:
        if amount <= 10:
            now = "Done"
        elif amount <= 50:
            now = "Thats all?"
        elif amount >= 90:
            now = "Big clear, buddy"
        elif amount >= 50:
            now = "Good cleaning"
        cln = discord.Embed(title = f'Messages cleared: {amount}. {now}', color= 0xFF3861)
        await ctx.channel.purge(limit = amount)
        await ctx.send(embed = cln)

Ну и о том, почему же ошибка в вашем коде: в python блок except обязательно требует тип обрабатываемого исключения. Если требуется обрабатывать любые исключения, в качестве класса указывается класс Exception, который является родителем (возможно, не в первом поколении, но всё-таки) всех классов-исключений.
То есть правильным будет не пример из первого блока, а из второго:

except:
    pass
except Exception:
    pass
→ Ссылка
Автор решения: xZartsust

Напишите так:

async def clear(ctx, amount: int = 10):

Так вы укажете что эта переменная может вмещать только числа(если будет указано не число то в консоль будет видавать такую ошибку: BadArgument), после этого напишите структуру try: ... except BadArgument: ...

@Bot.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def clear(ctx, amount: int = 10):
    try:
        if amount <= 10:
            now = "Done"
        elif amount <= 50:
            now = "Thats all?"
        elif amount >= 90:
            now = "Big clear, buddy"
        elif amount >= 50:
            now = "Good cleaning"
        cln = discord.Embed(title = f'Messages cleared: {amount}. {now}', color= 0xFF3861)
        await ctx.channel.purge(limit = amount)
        await ctx.send(embed = cln)
    except BadArgument:
        print("Do something")

Или можете еще написать так:

@Bot.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def clear(ctx, amount = 10):
        if amount <= 10:
            now = "Done"
        elif amount <= 50:
            now = "Thats all?"
        elif amount >= 90:
            now = "Big clear, buddy"
        elif amount >= 50:
            now = "Good cleaning"
        cln = discord.Embed(title = f'Messages cleared: {amount}. {now}', color= 0xFF3861)
        await ctx.channel.purge(limit = amount)
        await ctx.send(embed = cln)
@clear.error
async def clear_error(ctx, error):
    if isinstance(error, commands.BadArgument):
        pass #do something
→ Ссылка