Как обработать подобную ошибку в комманде бота на 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
Напишите так:
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