WedX - журнал о программировании и компьютерных науках

команда lyrics в discord.py keyerror

Итак, я недавно создал команду для текстов песен, и она работает! Единственная проблема заключается в том, что когда я писал тарабарщину, он отправлял ошибку. Произошла ошибка: команда вызвала исключение: KeyError: 'lyrics', для которого я добавил обработчик ошибки except KeyError, но он не сработал, не знаете почему?

@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"I wasn't able to send the lyrics for that song since it exceeds 2000 characters. However, here's the file for the lyrics!",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="Aw Snap!",description="I wasn't able to find the lyrics of that song.",color = 0xa3a3ff)
       em.set_thumbnail(url='https://cdn.discordapp.com/attachments/830818408550629407/839555682436251698/aw_snap_large.png')
       await ctx.send(embed=em)


Ответы:


1

Ваш блок try-except находится после строки, вызывающей ошибку.

# ...
lyrics = json_data['lyrics'] # Erroneous line
try:
    # ...

Если вы хотите, чтобы исключение возникло и было перехвачено, как в питоническом методе, вы можете переместить строку объявления lyrics в блок try.

В качестве альтернативы вы можете использовать get (), чтобы безопасно получить значение и заменить блок try-except на if-else:

# ...
lyrics = json_data.get('lyrics')
if lyrics:
    # Show lyrics
    if len(lyrics) > 2048:
        em = discord.Embed(title=title,description = f"I wasn't able to send the lyrics for that song since it exceeds 2000 characters. However, here's the file for the lyrics!",color=0xa3a3ff)
        await ctx.send(embed=em)
        # ...
else:
    # Show message
    em = discord.Embed(title="Aw Snap!",description="I wasn't able to find the lyrics of that song.",color = 0xa3a3ff)
    em.set_thumbnail(url='https://cdn.discordapp.com/attachments/830818408550629407/839555682436251698/aw_snap_large.png')
    await ctx.send(embed=em)
06.05.2021
  • после тестирования кода json_data.get ('lyrics') он работал, но теперь я получаю еще одну ошибку, когда пишу тарабарщину: произошла ошибка: команда вызвала исключение: TypeError: объект типа 'NoneType' не имеет len () @ Ankurbohra04 06.05.2021
  • Я считаю, что вы не поместили содержимое try: branch внутрь if lyrics: branch, len(lyrics) следует вызывать только в том случае, если текст песни действительно существует, поэтому его необходимо поместить внутри if lyrics: branch 06.05.2021
  • Я сделал, и он работает, но обработчик ошибок не работает. 06.05.2021
  • Я вижу, это должно заменить обработчик ошибок, а не помочь ему. json_data.get () не выдаст ошибку, даже если тексты песен не найдены, поэтому обработка ошибок не требуется. Я отредактировал свой ответ, чтобы указать ветви. 06.05.2021
  • если не len (текст): em = discord.Embed (title = Aw Snap!, description = Мне не удалось найти текст этой песни., color = 0xa3a3ff) em.set_thumbnail (url = 'cdn.discordapp.com/attachments/83081840855062940it (cdn.discordapp.com/attachments/830818408550629407/tx) = em) 06.05.2021
  • Это код после оператора if len (текст) ›2048: and else. 06.05.2021
  • а те работают @ ankurbohra04 06.05.2021
  • Нет, это не сработает, я не предоставил вам рабочий полный код. Комментарии, в которых говорится ... должны были подразумевать, что туда должен быть добавлен соответствующий код. Я считаю, что здесь есть небольшое недоразумение, вы поняли, как блок try-except был переведен в блок if-else? 06.05.2021
  • Бро, теперь он работает, но единственная проблема - это оператор if len (текст) ›2048, если текст содержит более 2000 символов, он возвращает неверный запрос, а не отправляет его в текстовом файле, как это было раньше. 06.05.2021
  • Это кажется выходящим за рамки этого вопроса, создайте другой вопрос с необходимой информацией. 06.05.2021
  • Хорошо, я создал новые вопросы, проверьте их: stackoverflow.com/questions/67414005/ 06.05.2021

  • 2

    Ошибка возникает в этой строке: lyrics = json_data['lyrics']. Вы должны поместить try-except вокруг него. Или блокирующий if оператор, обрабатывающий отсутствующие тексты песен:

    lyrics = json_data.get('lyrics', None)
    if not lyrics:
        em = discord.Embed(title="Aw Snap!",description="I wasn't able to find the lyrics of that song.",color = 0xa3a3ff) 
        em.set_thumbnail(url='https://cdn.discordapp.com/attachments/830818408550629407/839555682436251698/aw_snap_large.png')
        await ctx.send(embed=em)
        return
    ...
    
    06.05.2021
  • к сожалению, это не сработало 06.05.2021
  • Вы все еще получаете ошибку KeyError? 06.05.2021
  • нет, я получаю новую ошибку: Произошла ошибка: команда вызвала исключение: TypeError: объект типа 'NoneType' не имеет len () 06.05.2021
  • Я изменил код на оператор if else if, кстати 06.05.2021
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]