Kedua potongan kode berikut melakukan hal yang sama. Mereka menangkap setiap pengecualian dan mengeksekusi kode di except:
blok tersebut
Cuplikan 1 -
try:
#some code that may throw an exception
except:
#exception handling code
Cuplikan 2 -
try:
#some code that may throw an exception
except Exception as e:
#exception handling code
Apa sebenarnya perbedaan di kedua konstruksi tersebut?
python
python-3.x
narendranathjoshi
sumber
sumber
except Exception, e:
danexcept Exception as e:
. Pertanyaan ini menanyakan apa perbedaan antaraexcept:
danexcept Exception as e:
.Jawaban:
Yang kedua Anda dapat mengakses atribut objek pengecualian:
>>> def catch(): ... try: ... asd() ... except Exception as e: ... print e.message, e.args ... >>> catch() global name 'asd' is not defined ("global name 'asd' is not defined",)
Tapi itu tidak menangkap
BaseException
atau pengecualian sistemSystemExit
,KeyboardInterrupt
danGeneratorExit
:>>> def catch(): ... try: ... raise BaseException() ... except Exception as e: ... print e.message, e.args ... >>> catch() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in catch BaseException
Yang telanjang kecuali tidak:
>>> def catch(): ... try: ... raise BaseException() ... except: ... pass ... >>> catch() >>>
Lihat bagian Pengecualian Bawaan dari dokumen dan bagian Kesalahan dan Pengecualian dari tutorial untuk info lebih lanjut.
sumber
Exception
berasal dariBaseException
, itulah mengapaexcept Exception
tidak menangkapBaseException
. Jika Anda menulisexcept BaseException
, itu akan ketahuan juga. Bareexcept
menangkap semuanya.except
harus menjadi yang terakhir dalam serangkaianexcept
blok, sementara Anda tidak akan mendapatkan kesalahan jika Anda meletakkanexcept Exception
sebelumexcept
blok lain : mereka hanya akan diabaikan secara diam-diam (jika mereka menanganiException
subclass). Sesuatu yang harus diperhatikan.except
danexcept Exception
. "Sesuatu yang harus diperhatikan" terlihat sedikit aneh sekarang, tetapi pada saat itu saya mengharapkan Python untuk memilihexcept
blok yang paling spesifik , dimanapun itu, dan sedikit kecewa untuk mengetahui sebaliknya.except:
menerima semua pengecualian, sedangkan
except Exception as e:
hanya menerima pengecualian yang seharusnya Anda tangkap.
Inilah contoh salah satu yang tidak seharusnya Anda tangkap:
>>> try: ... input() ... except: ... pass ... >>> try: ... input() ... except Exception as e: ... pass ... Traceback (most recent call last): File "<stdin>", line 2, in <module> KeyboardInterrupt
Yang pertama membungkam
KeyboardInterrupt
!Berikut daftar singkatnya:
issubclass(BaseException, BaseException) #>>> True issubclass(BaseException, Exception) #>>> False issubclass(KeyboardInterrupt, BaseException) #>>> True issubclass(KeyboardInterrupt, Exception) #>>> False issubclass(SystemExit, BaseException) #>>> True issubclass(SystemExit, Exception) #>>> False
Jika Anda ingin menangkap salah satu dari itu, yang terbaik adalah melakukannya
except BaseException:
untuk menunjukkan bahwa Anda tahu apa yang Anda lakukan.
Semua pengecualian berasal
BaseException
, dan pengecualian yang seharusnya Anda tangkap sehari-hari (yang akan diberikan untuk programmer) juga mewarisiException
.sumber
except(Exception)
tidak pernah menemukanKeyboardInterrupt
kesalahan.as e
tidak ada hubungannya dengan itu.as e
, karena saya berasumsi sudah jelas apa yang dilakukannya.SystemExit
atauKeyboardInterrupt
hindari. Bukan kasus umum, tetapi itu terjadi.Ada perbedaan dengan beberapa pengecualian, misalnya KeyboardInterrupt.
Membaca PEP8 :
sumber
Menggunakan formulir kedua memberi Anda variabel (dinamai berdasarkan
as
klausa, dalam contoh Andae
) dalamexcept
lingkup blok dengan objek pengecualian terikat padanya sehingga Anda dapat menggunakan informasi dalam pengecualian (jenis, pesan, jejak tumpukan, dll) untuk menangani pengecualian di manor yang lebih dirancang khusus.sumber
Cara lain untuk melihat ini. Lihat detail pengecualian:
In [49]: try: ...: open('file.DNE.txt') ...: except Exception as e: ...: print(dir(e)) ...: ['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']
Ada banyak "hal" untuk diakses menggunakan sintaks 'sebagai e'.
Kode ini hanya dimaksudkan untuk menunjukkan detail dari instance ini.
sumber