Определение исключения без параметров:
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
.
Да, есть разница между ValueError
и ValueError()
ValueError
- это класс, тогда как ValueError()
создает экземпляр класса. По этой причине type(ValueError) is type
а type(ValueError()) is ValueError
Единственная цель raise
- поднять исключение,
когда мы используем
ValueError
, будет вызван класс, который в свою очередь запускает конструкторValueError()
когда мы используем
ValueError()
, методValueError()
вызывается напрямую.
Примечание: raise ValueError # shorthand for 'raise ValueError()'