2010-07-12 8 views
10

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

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

Заранее спасибо Фабьен

ответ

3

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

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

Для любопытных см. Http://www.python.org/dev/peps/pep-0352/#transition-plan для получения дополнительной информации об исключении из-за исключения. –

+8

Я не могу понять, что вы рекомендуете. Кажется, что ваш пример кода не подходит для **. Возможно, вам следует показать, что * должно быть сделано. –

+0

Все еще не уверен, что делать. – FrenchKheldar

0

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

raise 1 

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

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

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

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

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

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

3

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


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

try: 
    raise KeyboardInterrupt 

Эта форма является совершенно законным и в Python 2 и 3. Выписка из pep-3109:

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

Он также описан в Python documentation:

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

 Смежные вопросы

  • Нет связанных вопросов^_^