Argumen utama buku ini adalah bahwa versi pengecualian kode lebih baik karena akan menangkap apa pun yang mungkin Anda abaikan jika Anda mencoba menulis pengecekan kesalahan sendiri.
Saya pikir pernyataan ini benar hanya dalam keadaan yang sangat spesifik - di mana Anda tidak peduli jika hasilnya benar.
Tidak ada keraguan bahwa mengajukan pengecualian adalah praktik yang sehat dan aman. Anda harus melakukannya kapan pun Anda merasa ada sesuatu dalam kondisi saat ini dari program yang Anda (sebagai pengembang) tidak bisa, atau tidak ingin, atasi.
Namun, contoh Anda adalah tentang menangkap pengecualian. Jika Anda menangkap pengecualian, Anda tidak melindungi diri dari skenario yang mungkin Anda abaikan. Anda melakukan sebaliknya: Anda berasumsi bahwa Anda tidak mengabaikan skenario apa pun yang mungkin menyebabkan jenis pengecualian ini, dan karena itu Anda yakin bahwa tidak apa-apa untuk menangkapnya (dan dengan demikian mencegahnya menyebabkan program keluar, sebagai pengecualian tanpa tertangkap akan).
Menggunakan pendekatan pengecualian, jika Anda melihat ValueError
pengecualian, Anda melewatkan satu baris. Menggunakan pendekatan non-pengecualian tradisional, Anda menghitung jumlah nilai yang dikembalikan dari split
, dan jika kurang dari 2, Anda melewatkan satu baris. Jika Anda merasa lebih aman dengan pendekatan pengecualian, karena Anda mungkin telah melupakan beberapa situasi "kesalahan" lain dalam pemeriksaan kesalahan tradisional Anda, dan except ValueError
akan menangkapnya untuk Anda?
Ini tergantung pada sifat program Anda.
Jika Anda menulis, misalnya, peramban web atau pemutar video, masalah dengan input tidak boleh menyebabkannya rusak dengan pengecualian yang tidak tertangkap. Jauh lebih baik untuk mengeluarkan sesuatu yang masuk akal (bahkan jika, sebenarnya, salah) daripada berhenti.
Jika Anda menulis aplikasi di mana kebenarannya penting (seperti perangkat lunak bisnis atau rekayasa), ini akan menjadi pendekatan yang mengerikan. Jika Anda lupa tentang beberapa skenario yang muncul ValueError
, hal terburuk yang dapat Anda lakukan adalah mengabaikan skenario yang tidak diketahui ini secara diam-diam dan lewati saja. Begitulah bug yang sangat halus dan mahal berakhir di perangkat lunak.
Anda mungkin berpikir bahwa satu-satunya cara Anda dapat melihat ValueError
dalam kode ini, adalah jika split
dikembalikan hanya satu nilai (bukan dua). Tetapi bagaimana jika print
pernyataan Anda kemudian mulai menggunakan ekspresi yang muncul ValueError
dalam beberapa kondisi? Ini akan menyebabkan Anda melewatkan beberapa baris bukan karena mereka ketinggalan :
, tetapi karena print
gagal pada mereka. Ini adalah contoh bug halus yang saya maksudkan sebelumnya - Anda tidak akan melihat apa-apa, hanya kehilangan beberapa baris.
Rekomendasi saya adalah untuk menghindari menangkap (tetapi tidak menaikkan!) Pengecualian dalam kode di mana menghasilkan output yang salah lebih buruk daripada keluar. Satu-satunya waktu saya menangkap pengecualian dalam kode tersebut adalah ketika saya memiliki ekspresi yang benar-benar sepele, jadi saya dapat dengan mudah alasan apa yang menyebabkan masing-masing jenis pengecualian yang mungkin.
Mengenai dampak kinerja menggunakan pengecualian, itu sepele (dengan Python) kecuali pengecualian yang sering ditemui.
Jika Anda menggunakan pengecualian untuk menangani kondisi yang terjadi secara rutin, dalam beberapa kasus Anda mungkin harus membayar biaya kinerja yang sangat besar. Misalnya, misalkan Anda menjalankan beberapa perintah dari jarak jauh. Anda dapat memeriksa apakah teks perintah Anda melewati setidaknya validasi minimum (mis., Sintaks). Atau Anda bisa menunggu pengecualian muncul (yang terjadi hanya setelah server jauh mem-parsing perintah Anda dan menemukan masalah dengannya). Jelas, yang pertama adalah urutan besarnya lebih cepat. Contoh sederhana lain: Anda dapat memeriksa apakah angka nol ~ 10 kali lebih cepat daripada mencoba menjalankan divisi dan kemudian menangkap pengecualian ZeroDivisionError.
Pertimbangan ini hanya masalah jika Anda sering mengirim string perintah salah ke server jauh atau menerima argumen bernilai nol yang Anda gunakan untuk divisi.
Catatan: Saya berasumsi Anda akan menggunakan except ValueError
bukan yang adil except
; seperti yang ditunjukkan orang lain, dan seperti yang dikatakan buku itu dalam beberapa halaman, Anda tidak boleh menggunakan telanjang except
.
Catatan lain: pendekatan non-pengecualian yang tepat adalah menghitung jumlah nilai yang dikembalikan oleh split
, alih-alih mencari :
. Yang terakhir ini terlalu lambat, karena mengulangi pekerjaan yang dilakukan oleh split
dan mungkin hampir dua kali lipat waktu eksekusi.