次のような例外ステートメントの「、」と「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で両方とも有効な場合、どちらを使用すればよいですか?
最終的なドキュメントは PEP-3110:例外をキャッチ
概要:
as
の使用は、変数に例外を割り当てるためにrequiredです。as
構文を使用します。as
はサポートされていないため、コンマバージョンを使用します。はい、合法です。 Python 2.6を実行しています
try:
[] + 3
except Exception as x:
print "woo hoo"
>>>
woo hoo
Update:as
構文を使用する別の理由があります。 ,
を使用すると、他の人が指摘したように、物事がはるかに曖昧になります。そして、ここが違いを生むものです。 Python 2.6の時点で、 1つのmulticatch
ブロックで複数の例外をキャッチ できるexcept
があります。このような状況では、もっと表現力豊かでPythonicです
except (exception1, exception2) as e
言うよりも
except (exception1, exception2), e
まだ機能する
「as」構文は今後推奨される構文ですが、コードが古いPythonバージョン(2.6が新しいものをサポートする最初のバージョン)で動作する必要がある場合は、コンマ構文を使用する必要があります。
すべてのpythonバージョンをサポートする場合は、次のようにsys.exc_info()関数を使用できます。
try:
a = 1/'0'
except (ZeroDivisionError, TypeError):
e = sys.exc_info()[1]
print(e.args[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