web-dev-qa-db-ja.com

Python try ... exceptカンマvs 'as'を除いて

次のような例外ステートメントの「、」と「as」の違いは何ですか?

try:
    pass
except Exception, exception:
    pass

そして:

try:
    pass
except Exception as exception:
    pass

2.6では2番目の構文は有効ですか? WindowsのCPython 2.6で動作しますが、cygwinの2.5インタープリターは無効であると文句を言います。

2.6で両方とも有効な場合、どちらを使用すればよいですか?

237
Peter Graham

最終的なドキュメントは PEP-3110:例外をキャッチ

概要:

  • Python 3.xでは、asの使用は、変数に例外を割り当てるためにrequiredです。
  • Python 2.6+では、Python 3.xとのあいまいさが少なく、上位互換性があるため、as構文を使用します。
  • Python 2.5以前では、asはサポートされていないため、コンマバージョンを使用します。
274
Amber

はい、合法です。 Python 2.6を実行しています

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

>>> 
woo hoo

Updateas構文を使用する別の理由があります。 ,を使用すると、他の人が指摘したように、物事がはるかに曖昧になります。そして、ここが違いを生むものです。 Python 2.6の時点で、 1つのmulticatchブロックで複数の例外をキャッチ できるexceptがあります。このような状況では、もっと表現力豊かでPythonicです

except (exception1, exception2) as e

言うよりも

except (exception1, exception2), e

まだ機能する

38
inspectorG4dget

「as」構文は今後推奨される構文ですが、コードが古いPythonバージョン(2.6が新しいものをサポートする最初のバージョン)で動作する必要がある場合は、コンマ構文を使用する必要があります。

17
Alex Gaynor

すべての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

9
pthomaid

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
0
Marcello Romani