Pythonは...を除いてコンマvs「として」を除く


246

以下の例のように、exceptステートメントの「、」と「as」の違いは何ですか。

try:
    pass
except Exception, exception:
    pass

そして:

try:
    pass
except Exception as exception:
    pass

2番目の構文は2.6で合法ですか?これはWindows上のCPython 2.6で機能しますが、cygwinの2.5インタープリターは無効であると不平を言います。

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

回答:


284

決定的なドキュメントはPEP-3110:例外のキャッチです。

概要:

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

16
asPython 3.xでローカルに例外を割り当てる唯一の方法は、を使用することです。ただし、必要asがない場合は指定する必要がないため必須ではありません。
メルカトル、2015

38

はい、それは合法です。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

それでも機能します


13
2.6 より前のバージョンのPythonでは、タプルを使用して複数の例外タイプをキャッチすることもできました。しかし、構文は混乱を招きました。あなたは、使用したいexcept NameError, ValueError:理由を疑問に思い、その後ValueError例外がキャッチされなかっされませんでした。または使用されexcept (NameError, e):、のNameErrorために残されました'e'
Martijn Pieters

17

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


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/finallyexceptブロック内でを使用してブロックをdel e終了する前に実行されることを確認しない限り、この同等のコードはわずかに同等ではありませんexcept
ShadowRanger 2017

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.