Определение исключения без параметров:
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()'