Подтвердить что ты не робот

Правильный способ повысить исключение в python?

Вот простой код:

import sys

class EmptyArgs(StandardError):
    pass

if __name__ == "__main__":
    #first way to raise exception
    if len(sys.argv) == 1:
       raise EmptyArgs     
    #second way to raise exception
    if len(sys.argv) == 1:
       raise EmptyArgs()

Какой путь "более" правильный? Оба работают.
Примечание. В моем реальном коде исключение точно такое же, как я заявил: без сообщений и аргументов.

4b9b3361

Ответ 1

Оба являются правильными; последняя форма позволяет прикрепить аргументы к вашему исключению:

if len(sys.argv) == 1:
   raise EmptyArgs('Specify at least 1 argument')

Вы также можете передать аргументы в качестве второго значения в качестве кортежа в выражении raise:

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',)

но одно значение не-кортежа будет работать и рассматривается как единственный аргумент:

if len(sys.argv) == 1:
   raise EmptyArgs, 'Specify at least 1 argument'

и третье значение raise позволяют указать альтернативную трассировку, которая затем используется вместо трассировки, которая будет сгенерирована для текущего местоположения в коде:

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',), traceback_object

См. документацию для инструкции raise

Обратите внимание, что когда вы используете аргументы для своего исключения, Python styleguide PEP 8 предпочитает, чтобы вы предоставили экземпляр исключения, а не класс:

При создании исключения используйте raise ValueError('message') вместо старой формы raise ValueError, 'message'.

Форма, использующая парный вариант, предпочтительнее, потому что, когда аргументы исключений длинны или включают форматирование строк, вам не нужно использовать символы продолжения строки благодаря содержащимся круглым скобкам. Старая форма будет удалена в Python 3.

Python 3 больше не будет поддерживать эту форму.

Ответ 2

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

raise MyException()

потому что в Python 3.0 аналогичный случай был удален для хорошего

raise Exception, "foo"

Должен быть один - и желательно только один - простой способ сделать это.

Ответ 3

Две формы эквивалентны; они оба бросают экземпляр EmptyArgs. Из документация:

Если первым объектом является класс, он становится типом исключения. Второй объект используется для определения значения исключения: если это экземпляр класса, экземпляр становится значением исключения. Если второй объект является кортежем, он используется как список аргументов для конструктора классов; если это None, используется пустой список аргументов, и любой другой объект рассматривается как один аргумент для конструктора. Экземпляр, созданный при вызове конструктора, используется как значение исключения.

"Второй объект", упомянутый выше, является вторым необязательным аргументом raise:

raise EmptyArgs, 'Invalid input!'