Как заставить python выполнить исключение, вместо того, чтобы игнорировать его (discord.py)

#python #exception #events #discord.py #attributeerror

Вопрос:

Итак, я писал сценарий, который позволяет моему боту discord возвращать тексты песен после получения команды, используя API lyricgenius. Однако всякий раз, когда я намеренно вводил тарабарщину, чтобы бот не нашел текст и не выполнил код в блоке исключений AttributeError, консоль сообщала, что исключение было проигнорировано. Я использую discord.py версия 1.01. Есть какие-нибудь идеи? Заранее спасибо

 def fetch_lyrics(array):
    song = genius.search_song(title=array[0],artist=array[1])
    return song.lyrics

@client.event
async def on_message(message):
    if message.content.startswith("hello"):
        await message.channel.send("hello")

    if message.content.startswith("$lyrics"):
        global lyrics
        global searchstring
        pre_search_array =  message.content.split()
        del pre_search_array[0]

        for z in pre_search_array:
            searchstring  = z " "

        search_array = searchstring.split(",")

        if len(fetch_lyrics(search_array)) > 2000:
            pass

        else :
            try:
                await message.channel.send(fetch_lyrics(search_array))
            except AttributeError:
                await message.channel.send("Could not find the song")

        #resets the list
        searchstring = ""
        pre_search_array.clear()
        search_array.clear()


Error Message:
Ignoring exception in on_message
Traceback (most recent call last):
  File "/Users/kevinhadinata/Desktop/pythonProject2/venv/lib/python3.7/site-packages/discord/client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "/Users/kevinhadinata/Desktop/pythonProject2/main.py", line 38, in on_message
    if len(fetch_lyrics(search_array)) > 2000:
  File "/Users/kevinhadinata/Desktop/pythonProject2/main.py", line 16, in fetch_lyrics
    return song.lyrics
AttributeError: 'NoneType' object has no attribute 'lyrics'
Fatal read error on socket transport
protocol: <asyncio.sslproto.SSLProtocol object at 0x102ae0908>
transport: <_SelectorSocketTransport fd=11 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 801, in _read_ready__data_received
    data = self._sock.recv(self.max_size)
TimeoutError: [Errno 60] Operation timed out
 

Комментарии:

1. Можете ли вы показать ошибку, напечатанную в терминале?

2. @Церера закончила. Сейчас об этом идет речь

Ответ №1:

Вы используете fetch_lyrics (что вызывает ошибку) в len(fetch_lyrics(search_array)) > 2000: , вы должны поймать эту ошибку. Прямой метод состоял бы в том, чтобы перенести это в «попробуй и исключи».

 try:
   if len(fetch_lyrics(search_array)) > 2000:
            pass
except AttributeError:
   print('not a valid song')
 

Вы также можете вызвать пользовательскую ошибку в fetch_lyrics и поймать ее.

Комментарии:

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