Python coba ... kecuali koma vs 'as' di kecuali

246

Apa perbedaan antara ',' dan 'sebagai' dalam pernyataan kecuali, misalnya:

try:
    pass
except Exception, exception:
    pass

dan:

try:
    pass
except Exception as exception:
    pass

Apakah sintaks kedua legal di 2.6? Ia bekerja di CPython 2.6 pada Windows tetapi interpreter 2.5 di cygwin mengeluh bahwa itu tidak valid.

Jika keduanya valid dalam 2.6 yang mana yang harus saya gunakan?

Peter Graham
sumber

Jawaban:

284

Dokumen definitif adalah PEP-3110: Catching Exception

Ringkasan:

  • Dalam Python 3.x, menggunakan asyang diperlukan untuk menetapkan pengecualian untuk variabel.
  • Dalam Python 2.6+, gunakan assintaksis, karena jauh lebih sedikit ambigu dan maju kompatibel dengan Python 3.x.
  • Di Python 2.5 dan sebelumnya, gunakan versi koma, karena astidak didukung.
Amber
sumber
16
Menggunakan asadalah satu-satunya cara untuk menetapkan pengecualian ke lokal di Python 3.x. Tetapi astidak diperlukan , karena Anda tidak harus menentukannya jika Anda tidak membutuhkannya sama sekali.
Mercator
38

Ya itu legal. Saya menjalankan Python 2.6

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

>>> 
woo hoo

Pembaruan : Ada alasan lain untuk menggunakan assintaks. Menggunakan ,membuat banyak hal menjadi lebih ambigu, seperti yang ditunjukkan orang lain; dan inilah yang membuat perbedaan. Pada Python 2.6, ada multicatchyang memungkinkan Anda untuk menangkap beberapa pengecualian dalam satu exceptblok . Dalam situasi seperti itu, lebih ekspresif dan pythonic untuk dikatakan

except (exception1, exception2) as e

daripada mengatakan

except (exception1, exception2), e

yang masih akan bekerja

inspectorG4dget
sumber
13
Versi Python sebelum 2.6 memungkinkan Anda untuk menggunakan tuple untuk menangkap beberapa tipe pengecualian juga. Tetapi sintaksisnya membingungkan; Anda akan menggunakan except NameError, ValueError:kemudian bertanya-tanya mengapa ValueErrorpengecualian itu tidak pernah ditangkap. Atau digunakan except (NameError, e):dan ditinggalkan NameErroruntuk 'e'!
Martijn Pieters
17

sintaks "as" adalah yang lebih disukai untuk maju, namun jika kode Anda perlu bekerja dengan versi Python yang lebih lama (2.6 adalah yang pertama untuk mendukung yang baru) maka Anda harus menggunakan sintaks koma.

Alex Gaynor
sumber
9

Jika Anda ingin mendukung semua versi python, Anda dapat menggunakan sys.exc_info()fungsi seperti ini:

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])

(sumber: http://python3porting.com/noconv.html )

pthomaid
sumber
2
Catatan: Ada beberapa kasus sudut di sini yang harus diperhatikan. Dalam Py3, astarget (bersama dengan sisa info pengecualian) secara implisit deldiedit segera setelah Anda keluar dari exceptblok (ini mencegah beberapa referensi siklik yang terlibat dalam traceback yang disimpan dari menunda pelepasan memori sampai siklik GC berkeliling untuk menjalankan ). Jadi kode yang setara ini sedikit kurang setara, kecuali jika Anda menggunakan try/finallydi dalam exceptblok untuk memastikan del edilakukan sebelum keluar dari exceptblok.
ShadowRanger
0

Pada Python 3.7 (tidak yakin tentang versi lain) sintaks 'koma' tidak didukung lagi:

File sumber 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
Marcello Romani
sumber