x4zx
@x4zx
python developer

Как выводить ошибку в чат?

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

Код:

@commands.command()
    async def lyrics(self, ctx,*, title):

        url = f"https://some-random-api.ml/lyrics?title={title}"
        response = requests.get(url)
        json_data = json.loads(response.content)
        lyrics = json_data['lyrics']
        try:
            if len(lyrics) > 2048:
                em = discord.Embed(title=title,description = f"Я не смог отправить текст этой песни, поскольку он превышает 2000 символов. Однако вот файл с текстами песен!",color=0xa3a3ff)
                await ctx.send(embed=em)
                file = open("lyrics.txt", "w")
                file.write(lyrics)
                file.close() 
                return await ctx.send(file=discord.File("lyrics.txt"))
            else:
                em = discord.Embed(title=title,description=lyrics,color=0xa3a3ff)
                await ctx.send(embed=em)
        except KeyError:
            em = discord.Embed(title="Вот блин!",description="Мне не удалось найти текст этой песни.",color = 0xa3a3ff)
            em.set_thumbnail(url='https://cdn.discordapp.com/attachments/830818408550629407/839555682436251698/aw_snap_large.png')
            await ctx.send(embed=em)
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Если используете чей-то API, то стоит глянуть доку, что возвращается в случае неудачи (ну или просто самому попробовать). Скорее всего либо 4XX/5XX статусы, либо условный {"success": "false"}. Далее уже проверяете статус код, либо что нибудь в теле ответа. Это будет правильно.

Чтобы именно ваш код работал, удалите KeyError, вряд ли такой вид вообще вызывается при таком коде

upd: а, нифига себе, some-random-api не заглушка, а реальный сайт)
Как и следовало, ошибки 500.

@commands.command()
async def lyrics(self, ctx,*, title):

    url = f"https://some-random-api.ml/lyrics?title={title}"
    req = requests.get(url)
    response = req.json()

    if req.status_code == 200:
        lyrics = response['lyrics']

        if len(lyrics) > 2048:
            em = discord.Embed(title=title,description = f"Я не смог отправить текст этой песни, поскольку он превышает 2000 символов. Однако вот файл с текстами песен!",color=0xa3a3ff)
            await ctx.send(embed=em)
            
            with open('lyrics.txt', 'w', encoding='utf-8') as f:
                f.write(lyrics)
            
            await ctx.send(file=discord.File('lyrics.txt'))

        else:
            em = discord.Embed(title=title,description=lyrics,color=0xa3a3ff)
            await ctx.send(embed=em)

    elif req.status_code == 500:

        error = response.get('error', '?')

        if error == 'Sorry I couldn\'t find that song\'s lyrics':
            em = discord.Embed(title="Вот блин!",description="Мне не удалось найти текст этой песни.",color = 0xa3a3ff)
            em.set_thumbnail(url='https://cdn.discordapp.com/attachments/830818408550629407/839555682436251698/aw_snap_large.png')
            await ctx.send(embed=em)

        elif error == 'Something went wrong with fetching the lyrics':
            # тут что-то отвалилось, 500 код как он есть, можно попробовать запрос еще раз отправить на сайт,
            # либо сказать пользователю что на сайте проблемы, пусть еще раз попробует
            pass

        else:
            em = discord.Embed(title="Вот блин!", description=f"Неизвестная ошибка: {error}",color = 0xa3a3ff)
            em.set_thumbnail(url='https://cdn.discordapp.com/attachments/830818408550629407/839555682436251698/aw_snap_large.png')
            await ctx.send(embed=em)
    else:
        # ну тут уже бог знает что случилось, сайт ни ошибкой, ни хорошим ответом не порадовал.


x4zx, обновил ответ
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы