Bagaimana saya bisa menulis blok try
/ except
yang menangkap semua pengecualian?
python
exception-handling
pengguna469652
sumber
sumber
sys.stderr
dan mungkin dicatat. Itu adalah pengecualian yang benar-benar valid dan umum.try: whatever() except Exception as e: exp_capture()
:?Jawaban:
Anda bisa tetapi Anda mungkin tidak boleh:
Namun, ini juga akan menangkap pengecualian seperti
KeyboardInterrupt
dan Anda biasanya tidak menginginkannya, bukan? Kecuali jika Anda langsung meningkatkan pengecualian - lihat contoh berikut dari dokumen :sumber
except Exception:
telanjang kecuali yang Anda miliki di sana juga akan menangkap yang BaseException.Terlepas dari
except:
klausa telanjang (yang seperti yang orang lain katakan tidak boleh Anda gunakan), Anda bisa menangkapException
:Anda biasanya hanya akan mempertimbangkan melakukan ini pada tingkat terluar kode Anda jika misalnya Anda ingin menangani pengecualian yang tidak tertangkap sebelum dihentikan.
Keuntungan
except Exception
lebih dari telanjangexcept
adalah bahwa ada beberapa pengecualian yang tidak akan ditangkap, paling jelasKeyboardInterrupt
danSystemExit
: jika Anda menangkap dan menelannya maka Anda bisa menyulitkan siapa pun untuk keluar dari skrip Anda.sumber
Exception
. Perhatikan bahwa tidak mungkin untuk menaikkanint
pengecualian, dan mencoba melakukannya menimbulkanTypeError
pengecualian, yang akan ditangkap olehexcept Exception
klausa terlampir dalam kasus seperti itu. Di sisi lain, kelas gaya lama dapat dinaikkan dan dikualifikasikan sebagai "non-pengecualian" yang tidak subkelasException
- ini akan ditangkap olehexcept
klausa telanjang tetapi tidak olehexcept Exception
klausa.TypeError
sys.exit()
biasanya berarti Anda mengharapkan aplikasi untuk berhenti tetapi jika Anda menangkap SystemExit tidak akan. Demikian juga jika Anda menekan control-C pada skrip yang sedang berjalan (Ctrl-break pada windows) Anda mengharapkan program untuk berhenti, tidak untuk menangkap kesalahan dan terus berjalan. Tetapi Anda dapat menangkap salah satu dari keduanya jika ingin melakukan pembersihan sebelum ada.Anda dapat melakukan ini untuk menangani pengecualian umum
sumber
Untuk menangkap semua pengecualian yang mungkin, tangkap
BaseException
. Itu di atas hierarki Pengecualian:Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
Tetapi seperti yang disebutkan orang lain, Anda biasanya tidak memerlukan ini, hanya untuk kasus tertentu.
sumber
Contoh yang sangat sederhana, mirip dengan yang ditemukan di sini:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Jika Anda mencoba untuk menangkap SEMUA pengecualian, maka letakkan semua kode Anda dalam pernyataan "coba:", sebagai ganti 'cetak "Melakukan tindakan yang dapat menimbulkan pengecualian."'.
Dalam contoh di atas, Anda akan melihat output dalam urutan ini:
1) Melakukan tindakan yang dapat menimbulkan pengecualian.
2) Akhirnya dipanggil langsung setelah menjalankan pernyataan coba apakah pengecualian dilemparkan atau tidak.
3) "Sebuah pengecualian dilemparkan!" atau "Semuanya tampak hebat!" tergantung pada apakah pengecualian dilemparkan.
Semoga ini membantu!
sumber
Ada beberapa cara untuk melakukan ini khususnya dengan Python 3.0 dan di atasnya
Pendekatan 1
Ini adalah pendekatan sederhana tetapi tidak direkomendasikan karena Anda tidak akan tahu persis baris kode mana yang benar-benar melempar pengecualian:
Pendekatan 2
Pendekatan ini direkomendasikan karena memberikan lebih banyak detail tentang setiap pengecualian. Itu termasuk:
Satu-satunya kelemahan adalah tracback perlu diimpor.
sumber
Saya baru saja menemukan trik kecil ini untuk menguji apakah nama pengecualian di Python 2.7. Terkadang saya telah menangani pengecualian khusus dalam kode, jadi saya perlu tes untuk melihat apakah nama itu ada dalam daftar pengecualian yang ditangani.
sumber
Perlu disebutkan ini bukan pengkodean Python yang tepat. Ini juga akan menangkap banyak kesalahan yang mungkin tidak ingin Anda tangkap.
sumber