Как я могу использовать эту обработку ошибок в Python? - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь добавить новый обработчик ошибок, но почему-то он не работает. Если пользователь забудет один из этих трех аргументов, я хотел бы отправить сообщение.

Код:

async def redeem(ctx, arg1, arg2, arg3):
    allowed_countries = ['US', 'GB', 'DE']
    accounts = []
    keys = []
    country = arg1.upper()
    keyGrab(keys)
    if country in allowed_countries:
        f = open('Accounts/' + str(country) + '.txt', 'r')
        for line in f:
            clean = line.split('\n')
            accounts.append(clean[0])

        f.close()
    if arg1 is None or arg2 is None or arg3 is None
        return await (ctx.send('Please enter in this format ...'))
    if country not in allowed_countries:
        return await (ctx.send('Sorry But the Country you Specified is Not Currently Offered'))
    if arg3 not in keys:
        return await (ctx.send('Sorry but you entered an invalid product key.'))

Не работает следующее:

if arg1 is None or arg2 is None or arg3 is None
    return await (ctx.send('Please enter in this format ...'))

Все остальное работает просто отлично.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Discord.py предлагает другой способ обработки ошибки без необходимости вручную проверять каждый аргумент, автоматически вызывая on_command_error, передавая контекст и возникающую ошибку. куча разных ошибок может быть передана, но единственное, что нас действительно волнует, это MissingRequiredArgument, поэтому мы проверим это с помощью оператора if .

from discord.ext import commands

bot = commands.Bot(...)

...

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.errors.MissingRequiredArgument):
        await ctx.send(f'Required arguments are missing for "{ctx.command}". \n'
                       f'```Usage: {ctx.prefix}{ctx.command} {ctx.command.signature}```')

        # you might also like
        # await ctx.send(f'Required arguments are missing for "{ctx.command}". '
        #                f'For help using this command, enter\n```{ctx.prefix}help {ctx.command.qualified_name}```')

Если вы не знакомы с некоторыми из приведенных выше утверждений (например, ctx.prefix, ctx.command.qualified_name), это может помочь проверить документацию для Context и Command .

Здесь первый ctx.send печатает сообщение, похожее на

Отсутствуют обязательные аргументы для "погашения".

Usage: !redeem <arg1> <arg2> <arg3>

Второй ctx.send печатает что-то вроде

Отсутствуют обязательные аргументы для "погашения". Чтобы получить справку по этой команде, введите

!help redeem

Отличительной особенностью этого является то, что он по умолчанию для всех команд. Это делает менее трудоемким проверку каждого аргумента.

Если вы хотите проверить, была ли ошибка вызвана определенной командой, просто вложите оператор if.

    if isinstance(error, commands.errors.MissingRequiredArgument):
        if ctx.command.name == 'redeem':
            # do something special
            ...
0 голосов
/ 04 июня 2019

Обработка ошибок обычно выполняется с try/except, похоже, вы просто делаете проверку границ или проверку ввода.В любом случае вам не хватает : в конце if.Также оператор if может быть сокращен, поскольку значение None считается Falsey.

if arg1 or arg2 or arg3:
    return await (ctx.send('Please enter in this format ...'))
...