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?

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.

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


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.


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 )


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.