Python, исключающий исключение без аргументов

Я хотел бы узнать, как лучше разбирать исключение без аргументов. В официальной документации на python вы можете увидеть это:

try:
    raise KeyboardInterrupt

(http://docs.python.org/tutorial/errors.html глава 8.6)

а в некоторых вариантах кода, таких как Django или код Google, вы можете увидеть это:

  def AuthenticateAndRun(self, username, password, args):
    raise NotImplementedError()

(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)

Исключение является инстанцитом перед тем, как быть поднятым, пока нет аргументов. Какова цель создания исключений без аргументов? Когда я должен использовать первый случай или второй случай?

Спасибо заранее Фабьен

Ответ 1

Поднятие класса исключения вместо экземпляра исключения является устаревшим синтаксисом и не должно использоваться в новом коде.

raise Exception, "This is not how to raise an exception..."

Ответ 2

Вы можете использовать любую форму, которая вам нравится. Нет никакой реальной разницы, и оба они являются законными в Python 2 и 3. Руководство по стилю Python не указывает, какой из них рекомендуется.


Немного больше информации о поддержке "классной формы":

try:
    raise KeyboardInterrupt

Эта форма совершенно легальна как в Python 2, так и в 3. Выдержка из pep-3109:

raise EXCEPTION используется для создания нового исключения. Эта форма имеет два подвыборки: EXCEPTION может быть классом исключений или экземпляром класс исключения; допустимыми классами исключения являются BaseException и его подклассы [5]. Если EXCEPTION является подклассом, он будет вызываться без аргументы для получения экземпляра исключения.

Это также описано в документации Python:

... Если это класс, экземпляр исключения будет получен в случае необходимости путем создания экземпляра класса без аргументов.

Ответ 3

В таких языках, как С++, вы можете поднять любой объект, а не только Исключения. Python более ограничен. Если вы попытаетесь:

raise 1

Вы получаете:

Traceback (most recent call last):
...
TypeError: exceptions must be old-style classes or derived from BaseException, not int

В модели программирования python вы обычно можете использовать класс самостоятельно, а не экземпляр (это удобно для быстрого создания уникальных экземпляров, просто определите класс). Поэтому неудивительно, что вы можете создать класс исключения вместо экземпляра исключения.

Однако, как сказал Игнасио, это устарело.

Кроме того, некоторые побочные замечания, которые не являются прямым вопросом:

Вы также можете увидеть повышение самостоятельно в некотором коде. Без какого-либо класса объектов или чего-либо еще. Он используется в обработчиках исключений, чтобы повторно поднять текущее исключение и сохранить начальную трассировку.