Python, выдающий исключение без аргументов - PullRequest
11 голосов
/ 12 июля 2010

Я хотел бы узнать наилучшую практику создания исключений без аргументов.В официальной документации по 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)

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

Заранее спасибо Fabien

Ответы [ 3 ]

4 голосов
/ 05 марта 2014

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


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

try:
    raise KeyboardInterrupt

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

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

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

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

3 голосов
/ 12 июля 2010

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

raise Exception, "This is not how to raise an exception..."
0 голосов
/ 12 июля 2010

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

raise 1

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

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

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

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

Также кое-что, что не является прямым вопросом:

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

...