回答:
決定的なドキュメントは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
as
Python 3.xでローカルに例外を割り当てる唯一の方法は、を使用することです。ただし、必要as
がない場合は指定する必要がないため、必須ではありません。