Спробуйте Python… крім коми через 'як' у, за винятком


246

Яка різниця між ',' і 'як' у винятках тверджень, наприклад:

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це не потрібно , оскільки не потрібно його вказувати, якщо він взагалі не потрібен.
Меркатор

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

який би ще працював


13
Версії Python до 2.6 дозволяли також використовувати кортеж для лову кількох типів винятків. Але синтаксис був заплутаним; Ви б except NameError, ValueError:тоді скористалися питанням, чому ValueErrorвиняток ніколи не спіймали. Або використовували except (NameError, e):і залишилися з NameErrorдля 'e'!
Martijn Pieters

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 )


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.