Apa maksud penggunaan else
klausa opsional dari try
pernyataan itu?
python
exception-handling
geowa4
sumber
sumber
Jawaban:
Pernyataan di
else
blok dieksekusi jika eksekusi jatuh dari bagian bawahtry
- jika tidak ada pengecualian. Jujur, saya tidak pernah menemukan kebutuhan.Namun, Menangani Pengecualian mencatat:
Jadi, jika Anda memiliki metode yang dapat, misalnya, melempar
IOError
, dan Anda ingin menangkap pengecualian yang dimunculkan, tetapi ada hal lain yang ingin Anda lakukan jika operasi pertama berhasil, dan Anda tidak ingin menangkap IOError dari operasi itu, Anda mungkin menulis sesuatu seperti ini:Jika Anda hanya memasukkan
another_operation_that_can_throw_ioerror()
setelahoperation_that_can_throw_ioerror
,except
akan menangkap kesalahan panggilan kedua. Dan jika Anda meletakkannya setelah seluruhtry
blok, itu akan selalu dijalankan, dan tidak sampai setelahfinally
. Theelse
memungkinkan Anda memastikanfinally
blok, danIOError
ditimbulkannya tidak tertangkap di sinisumber
return
,continue
ataubreak
.Ada satu alasan besar untuk menggunakan
else
- gaya dan keterbacaan. Biasanya ide yang baik untuk menyimpan kode yang dapat menyebabkan pengecualian di dekat kode yang berhubungan dengannya. Sebagai contoh, bandingkan ini:dan
Yang kedua bagus ketika
except
tidak bisa kembali lebih awal, atau melemparkan kembali pengecualian. Jika memungkinkan, saya akan menulis:Catatan: Jawaban disalin dari duplikat yang baru-baru ini diposting di sini , maka semua ini adalah "AskPassword".
sumber
Satu penggunaan: uji beberapa kode yang harus memunculkan pengecualian.
(Kode ini harus diabstraksi menjadi tes yang lebih umum dalam praktiknya.)
sumber
Penggunaan yang dimaksudkan adalah memiliki konteks agar lebih banyak kode dapat dijalankan jika tidak ada pengecualian di mana kode itu diharapkan ditangani.
Konteks ini menghindari penanganan kesalahan yang tidak Anda harapkan.
Tapi penting untuk memahami kondisi yang tepat yang menyebabkan klausul lain untuk lari, karena
return
,continue
danbreak
dapat mengganggu aliran kontrol untukelse
.Singkatnya
The
else
Pernyataan berjalan jika ada ada pengecualian dan jika tidak terganggu olehreturn
,continue
ataubreak
pernyataan.Jawaban lain melewatkan bagian terakhir itu.
Dari dokumen:
(Huruf ditambahkan.) Dan catatan kaki berbunyi:
Itu membutuhkan setidaknya satu sebelumnya kecuali klausa ( lihat tata bahasa ). Jadi itu sebenarnya bukan "coba-lagi," itu "coba-kecuali-lain (-akhirnya)," dengan
else
(danfinally
) menjadi opsional.The Python Tutorial mengelaborasi penggunaan yang dimaksudkan:
Contoh membedakan
else
versus kode mengikutitry
blokJika Anda menangani kesalahan,
else
blok tidak akan berjalan. Sebagai contoh:Dan sekarang,
sumber
Mencoba-kecuali-yang lain sangat bagus untuk menggabungkan pola EAFP dengan mengetik bebek :
Anda mungkin menganggap kode naif ini baik-baik saja:
Ini adalah cara terbaik untuk menyembunyikan bug parah dalam kode Anda secara tidak sengaja. Saya mengetik pembersihan di sana, tetapi AttributeError yang akan memberi tahu saya sedang ditelan. Lebih buruk lagi, bagaimana jika saya menulisnya dengan benar, tetapi metode pembersihan kadang-kadang diteruskan tipe pengguna yang memiliki atribut salah nama, menyebabkannya gagal setengah jalan melalui dan meninggalkan file tidak tertutup? Semoga berhasil men-debug yang satu itu.
sumber
Saya merasa sangat berguna ketika Anda memiliki pembersihan untuk melakukan itu harus dilakukan bahkan jika ada pengecualian:
sumber
Meskipun Anda tidak bisa memikirkan penggunaannya sekarang, Anda bisa bertaruh pasti ada gunanya. Berikut adalah contoh yang tidak imajinatif:
Dengan
else
:Tanpa
else
:Di sini Anda memiliki variabel yang
something
ditentukan jika tidak ada kesalahan yang terjadi. Anda dapat menghapus ini di luartry
blok, tetapi kemudian memerlukan beberapa deteksi berantakan jika suatu variabel didefinisikan.sumber
something = a[2]; print something
bagian dalam coba: blokir?Ada contoh yang bagus
try-else
dalam PEP 380 . Pada dasarnya, ia turun untuk melakukan penanganan pengecualian yang berbeda di berbagai bagian algoritma.Ini sesuatu seperti ini:
Ini memungkinkan Anda untuk menulis kode penanganan pengecualian lebih dekat ke tempat pengecualian itu terjadi.
sumber
Dari Kesalahan dan Pengecualian # Menangani pengecualian - docs.python.org
sumber
Melihat referensi Python tampaknya
else
dijalankan setelahtry
ketika tidak ada pengecualian. Klausul opsional lain dijalankan jika dan ketika kontrol mengalir dari akhir klausa coba. 2 Pengecualian dalam klausa lain tidak ditangani oleh klausa sebelumnya kecuali.Menyelam ke dalam python memiliki contoh di mana, jika saya mengerti dengan benar, dalam
try
blok mereka mencoba mengimpor modul, ketika itu gagal Anda mendapatkan pengecualian dan mengikat default tetapi ketika berfungsi Anda memiliki pilihan untuk masuk keelse
blok dan mengikat apa yang diperlukan (lihat tautan untuk contoh dan penjelasan).Jika Anda mencoba melakukan pekerjaan di
catch
blok itu mungkin melemparkan pengecualian lain - saya kira di situlahelse
blok berguna.sumber
try
blok.Itu dia. Blok 'lain' dari klausa coba-kecuali ada untuk kode yang berjalan ketika (dan hanya ketika) operasi yang dicoba berhasil. Itu bisa digunakan, dan bisa disalahgunakan.
Secara pribadi, saya suka dan menggunakannya saat yang tepat. Secara semantik mengelompokkan pernyataan.
sumber
Mungkin penggunaannya mungkin:
Mungkin ini akan membawa Anda terlalu berguna.
sumber
Saya telah menemukan
try: ... else:
konstruk yang berguna dalam situasi di mana Anda menjalankan kueri basis data dan mencatat hasil kueri tersebut ke basis data terpisah dengan rasa / jenis yang sama. Katakanlah saya memiliki banyak utas pekerja yang menangani semua kueri basis data yang dikirimkan ke antrianTentu saja jika Anda dapat membedakan antara kemungkinan pengecualian yang mungkin dilemparkan, Anda tidak harus menggunakan ini, tetapi jika kode bereaksi terhadap potongan kode yang berhasil mungkin melemparkan pengecualian yang sama dengan bagian yang berhasil, dan Anda tidak bisa hanya biarkan pengecualian kedua yang mungkin pergi, atau segera kembali pada kesuksesan (yang akan mematikan utas dalam kasus saya), maka ini berguna.
sumber
Sebuah
else
blok sering dapat eksis untuk fungsi yang terjadi di setiapexcept
blok.Dalam hal ini,
inconsistency_type
disetel di setiap blok kecuali, sehingga perilaku dilengkapi dalam kasus no-error dielse
.Tentu saja, saya menggambarkan ini sebagai pola yang mungkin muncul dalam kode Anda sendiri suatu hari nanti. Dalam kasus khusus ini, Anda hanya menetapkan
inconsistency_type
ke 0 sebelumtry
blok.sumber
Berikut adalah tempat lain di mana saya suka menggunakan pola ini:
sumber
continue
saja - pola "break out early". Ini memungkinkan Anda untuk menjatuhkan klausa "lain" dan lekukannya, membuat kode lebih mudah dibaca.Salah satu skenario penggunaan yang dapat saya pikirkan adalah pengecualian yang tidak dapat diprediksi, yang dapat dihindari jika Anda mencoba lagi. Misalnya, ketika operasi di blok uji coba melibatkan angka acak:
Tetapi jika pengecualian dapat diprediksi, Anda harus selalu memilih validasi terlebih dahulu daripada pengecualian. Namun, tidak semuanya dapat diprediksi, sehingga pola kode ini memiliki tempatnya.
sumber
break
dalamtry
di bagian akhir, yang merupakan IMO bersih, dan Anda tidak memerlukannyaelse
. Jugacontinue
tidak benar-benar dibutuhkan, Anda bisa sajapass
.Saya menemukan
else
berguna untuk berurusan dengan file konfigurasi yang mungkin salah:Pengecualian yang membaca
lock
konfigurasi menonaktifkan pemantauan kunci dan ValueErrors mencatat pesan peringatan yang bermanfaat.sumber
Misalkan logika pemrograman Anda tergantung pada apakah kamus memiliki entri dengan kunci yang diberikan. Anda dapat menguji hasil
dict.get(key)
menggunakanif... else...
konstruk, atau Anda dapat melakukan:sumber
Saya akan menambahkan use case lain yang tampaknya lurus ke depan saat menangani sesi DB:
sumber
The
else:
blok membingungkan dan (hampir) tidak berguna. Itu juga bagian darifor
danwhile
pernyataan.Sebenarnya, bahkan pada-
if
pernyataan,else:
dapat disalahgunakan dengan cara yang benar-benar mengerikan membuat bug yang sangat sulit ditemukan.Pertimbangkan ini.
Pikirkan dua kali
else:
. Ini umumnya masalah. Hindari kecuali dalamif
pernyataan-dan bahkan kemudian mempertimbangkan mendokumentasikanelse
- kondisi untuk membuatnya eksplisit.sumber
if x > 0: return "yes"
danif x <= 0: return "no"
. Sekarang seseorang datang dan mengubah salah satu syarat untuk mengatakanx > 1
tetapi lupa untuk mengubah yang lain. Bagaimana itu mengurangi jumlah bug yang mau dilakukan.if else
klausa kadang-kadang banyak garis yang terpisah. KERING adalah praktik yang baik, jauh lebih sering daripada tidak, sungguh. (maaf untuk pos ganda).