Почему это исключение выводится как «индекс списка вне диапазона»?

#python

Вопрос:

Я создаю практическую систему отправки кошелька/денег, но по какой-то причине, когда commands[3] or commands[4] вы находитесь вне зоны действия, она не активирует мое заявление «если except » в заявлении. Когда я печатаю e , он печатается как "list index out of range" .

Почему e печатается как "link index out of range" , но когда я запускаю if e == "link index out of range" его, он возвращается False ?

 if command_keyword == "send":
        try:
            globals()[commands[2]].send_funds(globals()[commands[3]], int(commands[1]))
        except Exception as e:
            if e == 'list index out of range':
                print("'send' command requires three arguments. 'send [amount] [sender] [recipient]'")
 

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

1. Потому что инструкция print вызывает внутреннюю __str__ функцию объекта e. Попробуйте использовать if str(e) == "link index out of range" , если это то, что вы хотите сделать. Но вам действительно следует выделить IndexError это в отдельный except блок от других исключений, а не пытаться интерпретировать сообщение об ошибке.

Ответ №1:

Это связано с тем, что тип исключения является IndexError , а информация является атрибутом исключения. Лучший способ справиться с таким исключением-это

 if command_keyword == "send":
        try:
            globals()[commands[2]].send_funds(globals()[commands[3]], int(commands[1]))
        except IndexError:
            print("'send' command requires three arguments. 'send [amount] [sender] [recipient]'")
 

Однако, если вы действительно хотите проверить сообщение вместо этого, вы можете получить его через e.args

 if command_keyword == "send":
        try:
            globals()[commands[2]].send_funds(globals()[commands[3]], int(commands[1]))
        except Exception as e:
            if e.args[0] == 'list index out of range':
                print("'send' command requires three arguments. 'send [amount] [sender] [recipient]'")
 

Однако обратите внимание, что это небезопасно, поскольку не у каждого исключения есть аргумент, и доступ e.args[0] может привести IndexError к ошибке.