Определение исключения без параметров:
class MyException(Exception):
pass
При поднятии есть ли разница между:
raise MyException
и
raise MyException()
Я не мог найти ничего; это просто перегруженный синтаксис?
Определение исключения без параметров:
class MyException(Exception):
pass
При поднятии есть ли разница между:
raise MyException
и
raise MyException()
Я не мог найти ничего; это просто перегруженный синтаксис?
Ответы:
Короткий ответ заключается в том, что оба они делают одно raise MyExceptionи raise MyException()то же. Эта первая форма автоматически создает ваше исключение.
В соответствующем разделе документации говорится: « raise оценивает первое выражение как объект исключения. Оно должно быть либо подклассом, либо экземпляром BaseException. Если это класс, экземпляр исключения будет получен при необходимости путем создания экземпляра класса с помощью без аргументов ".
Тем не менее, несмотря на то, что семантика одинакова, первая форма микроскопически быстрее, а вторая форма более гибкая (потому что вы можете передавать ей аргументы, если это необходимо).
Обычный стиль, который большинство людей использует в Python (т. Е. В стандартной библиотеке, в популярных приложениях и во многих книгах), - это использование raise MyExceptionпри отсутствии аргументов. Люди создают экземпляр исключения только тогда, когда нужно передать некоторые аргументы. Например: raise KeyError(badkey).
Посмотрите документы для raiseутверждения . Он создает экземпляр MyException.
raise немного изменился в Python 3. Часть, имеющая отношение к этому вопросу, остается той же (по- raise ExceptionTypeпрежнему создается экземпляр типа, вызывая его конструктор без аргументов).
Да, есть разница между ValueErrorиValueError()
ValueErrorявляется классом, тогда как ValueError()создает экземпляр класса. Это причина того, что type(ValueError) is typeиtype(ValueError()) is ValueError
Единственная цель raise- вызвать исключение,
когда мы используем
ValueError, будет вызываться класс, который, в свою очередь, запускает конструкторValueError()когда мы используем
ValueError(), методValueError()вызывается напрямую.
Примечание: raise ValueError # shorthand for 'raise ValueError()'