Saat Anda hanya ingin mencoba-kecuali tanpa menangani pengecualian, bagaimana Anda melakukannya dengan Python?
Apakah mengikuti cara yang benar untuk melakukannya?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Joan Venge
sumber
sumber
shutil.rmtree(path, ignore_errors=True)
. Namun, ini tidak berlaku untuk sebagian besar fungsi.try: rob() except: run()
Jawaban:
atau
Perbedaannya adalah bahwa yang pertama juga akan menangkap
KeyboardInterrupt
,SystemExit
dan hal-hal seperti itu, yang berasal langsung dariexceptions.BaseException
, bukanexceptions.Exception
.Lihat dokumentasi untuk detail:
try
pernyataansumber
try: shuti.rmtree(...) except: pass
akan secara kasar menekan kesalahan (bahkan jika Anda salah mengejashutil
menghasilkanNameError
) - setidaknya lakukanexcept OSError:
Biasanya dianggap praktik terbaik untuk hanya menangkap kesalahan yang Anda minati. Dalam hal
shutil.rmtree
ini mungkinOSError
:Jika Anda ingin mengabaikan kesalahan itu secara diam-diam, lakukan:
Mengapa? Katakanlah Anda (entah bagaimana) secara tidak sengaja melewatkan fungsi integer alih-alih sebuah string, seperti:
Ini akan memberikan kesalahan "TypeError: memaksa ke Unicode: perlu string atau buffer, int ditemukan" - Anda mungkin tidak ingin mengabaikan itu, yang bisa sulit untuk debug.
Jika Anda benar - benar ingin mengabaikan semua kesalahan, tangkap
Exception
daripadaexcept:
pernyataan kosong . Lagi-lagi mengapa?Tidak menentukan pengecualian menangkap setiap pengecualian, termasuk
SystemExit
pengecualian yang misalnyasys.exit()
menggunakan:Bandingkan ini dengan yang berikut, yang keluar dengan benar:
Jika Anda ingin menulis kode perilaku yang lebih baik,
OSError
pengecualian dapat mewakili berbagai kesalahan, tetapi dalam contoh di atas kami hanya ingin mengabaikannyaErrno 2
, sehingga kami bisa lebih spesifik:sumber
shutil.rmtree
bukan contoh terbaik, karena Anda hanya akan menggunakanignore_errors=True
untuk fungsi itu ..Itu tergantung pada apa yang Anda maksud dengan "penanganan."
Jika Anda bermaksud menangkapnya tanpa mengambil tindakan apa pun, kode yang Anda poskan akan berfungsi.
Jika Anda bermaksud ingin mengambil tindakan terhadap pengecualian tanpa menghentikan pengecualian dari menumpuk, maka Anda menginginkan sesuatu seperti ini:
sumber
Pertama saya kutip jawaban Jack o'Connor dari utas ini . Utas yang dirujuk ditutup jadi saya menulis di sini:
"Ada cara baru untuk melakukan ini dengan Python 3.4:
Inilah komit yang menambahkannya: http://hg.python.org/cpython/rev/406b47c64480
Dan inilah pengarangnya, Raymond Hettinger, yang membicarakan hal ini dan semua jenis kepanasan Python lainnya: https://youtu.be/OSGv2VnC0go?t=43m23s
Tambahan saya untuk ini adalah yang setara dengan Python 2.7:
Maka Anda menggunakannya seperti di Python 3.4:
sumber
Untuk kelengkapan:
Perhatikan juga bahwa Anda dapat menangkap pengecualian seperti ini:
... dan pasang kembali pengecualian seperti ini:
... contoh dari tutorial python .
sumber
Ada beberapa cara untuk melakukan ini.
Namun, pilihan contoh memiliki solusi sederhana yang tidak mencakup kasus umum.
Khusus untuk contoh:
Dari pada
Melakukan hal ini:
Ini adalah argumen khusus untuk
shutil.rmtree
. Anda dapat melihat bantuan tentang itu dengan melakukan hal berikut, dan Anda akan melihatnya juga memungkinkan untuk fungsionalitas pada kesalahan juga.Karena ini hanya mencakup contoh kasus yang sempit, saya akan menunjukkan lebih lanjut bagaimana menangani ini jika argumen kata kunci tersebut tidak ada.
Pendekatan umum
Karena contoh di atas hanya mencakup kasus sempit pada contoh, saya akan menunjukkan lebih lanjut bagaimana menangani hal ini jika argumen kata kunci tersebut tidak ada.
Baru dalam Python 3.4:
Anda dapat mengimpor
suppress
manajer konteks:Tetapi hanya menekan pengecualian yang paling spesifik:
Anda akan mengabaikan
FileNotFoundError
:Dari dokumen :
Perhatikan itu
suppress
danFileNotFoundError
hanya tersedia dalam Python 3.Jika Anda ingin kode Anda berfungsi di Python 2 juga, lihat bagian selanjutnya:
Python 2 & 3:
Untuk kode yang kompatibel dengan Python 2,
pass
adalah cara yang benar untuk memiliki pernyataan yang bukan pilihan. Tetapi ketika Anda melakukan telanjangexcept:
, itu sama seperti melakukanexcept BaseException:
yang meliputiGeneratorExit
,KeyboardInterrupt
, danSystemExit
, dan secara umum, Anda tidak ingin menangkap hal-hal.Bahkan, Anda harus spesifik dalam menyebutkan pengecualian yang Anda bisa.
Inilah bagian dari hierarki pengecualian Python (2) , dan seperti yang Anda lihat, jika Anda menangkap Pengecualian yang lebih umum, Anda dapat menyembunyikan masalah yang tidak Anda harapkan:
Anda mungkin ingin menangkap OSError di sini, dan mungkin pengecualian yang tidak Anda pedulikan adalah jika tidak ada direktori.
Kita bisa mendapatkan bahwa nomor kesalahan tertentu dari
errno
perpustakaan, dan reraise jika kita tidak memiliki itu:Catatan, kenaikan gaji memunculkan pengecualian asli, yang mungkin merupakan apa yang Anda inginkan dalam kasus ini. Ditulis lebih ringkas, karena kita tidak benar-benar perlu secara eksplisit
pass
dengan kode dalam penanganan perkecualian:sumber
Ini akan membantu Anda untuk mencetak apa pengecualian :( yaitu mencoba menangkap tanpa menangani pengecualian dan mencetak pengecualian.)
sumber
FYI klausa lain bisa berlaku setelah semua pengecualian dan hanya akan dijalankan jika kode dalam percobaan tidak menyebabkan pengecualian.
sumber
else
dalam konteks ini. Dan untuk menambahkan itufinally
akan selalu berjalan setelah (atau tidak terkecuali).Saya perlu mengabaikan kesalahan dalam beberapa perintah dan fuckit melakukan trik
sumber
Dalam Python, kami menangani pengecualian yang mirip dengan bahasa lain, tetapi perbedaannya adalah beberapa perbedaan sintaksis, misalnya,
sumber
Saya biasanya hanya melakukan:
sumber
_ = ""
denganpass
.