回答:
決定的なドキュメントはPEP-3110:例外のキャッチです。
概要:
asされる必要な変数に例外を割り当てます。as以降では、あいまいさが少なく、Python 3.xとの上位互換性があるため、構文を使用してください。asサポートされていないため、カンマバージョンを使用します。はい、それは合法です。Python 2.6を実行しています
try:
[] + 3
except Exception as x:
print "woo hoo"
>>>
woo hoo
更新:as構文を使用する別の理由があります。,他の人が指摘しているように、使用すると物事がより曖昧になります。そして、これが違いを生むものです。Python 2.6以降では、1つのブロックで複数の例外multicatchをキャッチexceptできるようになっています。そのような状況では、より表現力豊かでpythonicと言います
except (exception1, exception2) as e
言うよりも
except (exception1, exception2), e
それでも機能します
except NameError, ValueError:理由を疑問に思い、その後ValueError例外がキャッチされなかっされませんでした。または使用されexcept (NameError, e):、のNameErrorために残されました'e'!
今後は "as"構文が推奨されますが、コードが古いバージョンのPython(新しいバージョンをサポートする最初のバージョン)で動作する必要がある場合は、コンマ構文を使用する必要があります。
すべての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)
asターゲット(残りの例外情報とともに)が暗黙的にdel編集されますexcept(これにより、保存されたトレースバックに関連する一部の循環参照が、循環GCが実行されるまでメモリの解放が遅延するのを防ぎます)。したがってtry/finally、exceptブロック内でを使用してブロックをdel e終了する前に実行されることを確認しない限り、この同等のコードはわずかに同等ではありませんexcept。
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
asPython 3.xでローカルに例外を割り当てる唯一の方法は、を使用することです。ただし、必要asがない場合は指定する必要がないため、必須ではありません。