Python попробуй ... кроме запятой против "как" в кроме

246

В чем разница между ',' и 'as', за исключением утверждений, например:

try:
    pass
except Exception, exception:
    pass

и:

try:
    pass
except Exception as exception:
    pass

Законен ли второй синтаксис в 2.6? Он работает в CPython 2.6 в Windows, но интерпретатор 2.5 в cygwin жалуется, что он недействителен.

Если они оба действительны в 2.6, что я должен использовать?

Питер Грэм
источник

Ответы:

284

Окончательный документ PEP-3110: ловля исключений

Резюме:

  • В Python 3.x, используя asэто требуется назначить исключение переменной.
  • В Python 2.6+ используйте asсинтаксис, поскольку он гораздо менее неоднозначен и напрямую совместим с Python 3.x.
  • В Python 2.5 и более ранних версиях используйте запятую версию, поскольку asона не поддерживается.
янтарный
источник
16
Использование as- единственный способ присвоить исключение локальному в Python 3.x. Но asэто не обязательно , так как вам не нужно указывать это, если вам это вообще не нужно.
mercator
38

Да, это законно. Я использую Python 2.6

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo

Обновление : есть еще одна причина использовать asсинтаксис. Использование ,делает вещи намного более двусмысленными, как указывали другие; и вот что имеет значение. Начиная с Python 2.6 существует multicatchвозможность, позволяющая перехватывать несколько исключений в одном exceptблоке . В такой ситуации более выразительно и питонно говорить

except (exception1, exception2) as e

вместо того чтобы сказать

except (exception1, exception2), e

который бы все еще работал

inspectorG4dget
источник
13
Версии Python до 2.6 позволяли вам использовать кортеж для перехвата нескольких типов исключений. Но синтаксис сбивал с толку; вы бы except NameError, ValueError:потом задавались вопросом, почему ValueErrorисключение так и не было поймано. Или использовали except (NameError, e):и были оставлены NameErrorдля 'e'!
Мартин Питерс
17

Синтаксис «as» предпочтителен в дальнейшем, однако, если ваш код должен работать со старыми версиями Python (2.6 первым поддерживает новую), вам нужно будет использовать синтаксис запятых.

Алекс Гейнор
источник
9

Если вы хотите поддерживать все версии Python, вы можете использовать такую sys.exc_info()функцию:

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])

(источник: http://python3porting.com/noconv.html )

pthomaid
источник
2
Примечание: здесь есть несколько важных случаев, о которых следует знать. В Py3 asцель (вместе с остальной информацией об исключении) неявно редактируется, delкак только вы выходите из exceptблока (это предотвращает задержку освобождения памяти некоторыми циклическими ссылками, включенными в хранимую трассировку, до тех пор, пока циклический GC не приступит к работе ). Таким образом, этот эквивалентный код немного менее эквивалентен, если только вы не используете try/finallyвнутри exceptблока, чтобы убедиться, del eчто выполняется перед выходом из exceptблока.
ShadowRanger
0

Начиная с Python 3.7 (не уверен насчет других версий), синтаксис «запятая» больше не поддерживается:

Исходный файл exception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
  • $ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
  • $ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax
Марчелло Романи
источник