Saya tahu bahwa saya dapat melakukan:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
Saya juga bisa melakukan ini:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreTooShortException:
# stand on a ladder
Tetapi jika saya ingin melakukan hal yang sama di dalam dua pengecualian berbeda, yang terbaik yang dapat saya pikirkan saat ini adalah melakukan ini:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreBeingMeanException:
# say please
Apakah ada cara saya bisa melakukan sesuatu seperti ini (karena tindakan untuk mengambil dalam kedua pengecualian adalah untuk say please
):
try:
# do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
# say please
Sekarang ini benar-benar tidak akan berfungsi, karena cocok dengan sintaks untuk:
try:
# do something that may fail
except Exception, e:
# say please
Jadi, upaya saya untuk menangkap dua pengecualian berbeda tidak sepenuhnya berhasil.
Apakah ada cara untuk melakukan ini?
python
exception
exception-handling
inspectorG4dget
sumber
sumber
Jawaban:
Dari Dokumentasi Python :
Atau, hanya untuk Python 2:
Memisahkan pengecualian dari variabel dengan koma masih akan bekerja di Python 2.6 dan 2.7, tetapi sekarang sudah usang dan tidak berfungsi di Python 3; sekarang Anda harus menggunakan
as
.sumber
list
, dan hasilnya aTypeError
. Sepertinya kesalahan harus dalamtuple
agar penangkapan berfungsi seperti yang diharapkan.except
baris. Itu hanya perlu dipasangkan jika dibuat dalamexcept
baris.2 + (x * 2)
,(x * 2)
tentu saja bukan tupel. Kurung adalah konstruk pengelompokan umum. Karakteristik yang menentukan dari tuple adalah bahwa ia mengandung koma - lihat dokumentasi Python : "Perhatikan bahwa sebenarnya itu adalah koma yang membuat tuple, bukan tanda kurung."Melakukan hal ini:
Tanda kurung diperlukan karena sintaks lama yang menggunakan koma untuk menetapkan objek kesalahan ke nama. Kata
as
kunci digunakan untuk penugasan. Anda dapat menggunakan nama apa pun untuk objek kesalahan, saya lebih sukaerror
secara pribadi.Praktek terbaik
Untuk melakukan ini dengan cara yang saat ini dan meneruskan yang kompatibel dengan Python, Anda perlu memisahkan Pengecualian dengan koma dan membungkusnya dengan tanda kurung untuk membedakan dari sintaks sebelumnya yang menetapkan instance pengecualian ke nama variabel dengan mengikuti jenis Pengecualian untuk ditangkap dengan koma.
Berikut adalah contoh penggunaan sederhana:
Saya hanya menetapkan pengecualian ini untuk menghindari menyembunyikan bug, yang jika saya temui saya harapkan jejak stack penuh dari.
Ini didokumentasikan di sini: https://docs.python.org/tutorial/errors.html
Anda dapat menetapkan pengecualian ke variabel, (
e
adalah umum, tetapi Anda mungkin lebih suka variabel yang lebih bertele-tele jika Anda memiliki penanganan pengecualian yang lama atau IDE Anda hanya menyoroti pilihan yang lebih besar dari itu, seperti yang saya miliki.) Contoh memiliki atribut args. Berikut ini sebuah contoh:Perhatikan bahwa dalam Python 3,
err
objek jatuh keluar dari ruang lingkup ketikaexcept
blok disimpulkan.Usang
Anda dapat melihat kode yang menetapkan kesalahan dengan koma. Penggunaan ini, satu-satunya formulir yang tersedia di Python 2.5 dan sebelumnya, sudah tidak digunakan lagi, dan jika Anda ingin kode Anda maju kompatibel di Python 3, Anda harus memperbarui sintaks untuk menggunakan formulir baru:
Jika Anda melihat penetapan nama koma di basis kode Anda, dan Anda menggunakan Python 2.5 atau lebih tinggi, beralihlah ke cara baru untuk melakukannya sehingga kode Anda tetap kompatibel ketika Anda memutakhirkan.
The
suppress
manager konteksJawaban yang diterima benar-benar 4 baris kode, minimum:
The
try
,except
,pass
garis dapat ditangani dalam satu baris dengan manajer konteks menekan, tersedia dalam Python 3.4 :Jadi, ketika Anda ingin
pass
pengecualian tertentu, gunakansuppress
.sumber
suppress
, banyak lebih mudah dibaca daripada hanya melakukanpass
diexcept
Dari dokumentasi Python -> 8.3 Menangani Pengecualian :
sumber
Jika Anda sering menggunakan sejumlah besar pengecualian, Anda dapat menentukan terlebih dahulu tupel, sehingga Anda tidak perlu mengetik ulang berkali-kali.
CATATAN:
Jika Anda juga perlu menangkap pengecualian lain selain yang ada dalam tuple yang telah ditentukan sebelumnya, Anda perlu mendefinisikan blok kecuali yang lain.
Jika Anda tidak bisa mentolerir variabel global, tentukan di main () dan bagikan di mana diperlukan ...
sumber
Salah satu cara untuk melakukan ini adalah ..
dan cara lain adalah membuat metode yang melakukan tugas yang dieksekusi oleh
except
blok dan memanggilnya melalui semuaexcept
blok yang Anda tulis.Saya tahu bahwa yang kedua bukanlah cara terbaik untuk melakukan ini, tetapi saya hanya menunjukkan sejumlah cara untuk melakukan hal ini.
sumber
except
klausa adalah normal ketika Anda ingin menangani pengecualian secara berbeda.