Penanganan pengecualian
| English | Bahasa Indonesia |
|---|---|
| exception/ekˈsepʃn/ | pengecualian |
| exception handling/ekˈsepʃn ˈhændlɪŋ/ | penanganan pengecualian |
| raise/reɪz/ | meningkatkan |
Pengecekan yang tidak dapat ditulis
- Sebuah program membuka sebuah file. Sebelum membukanya, Anda bisa memeriksa apakah file tersebut ada, apakah dapat dibaca, apakah disk tersedia. Misalkan semua pengecekan berhasil.
- Antara pengecekan terakhir dan pembukaan, pengguna mencabut stik USB. File tersebut ada ketika Anda bertanya dan tidak ada ketika Anda membukanya, dan tidak ada jumlah pengecekan sebelumnya yang dapat menutup kesenjangan itu.
- Beberapa kesalahan sebenarnya tidak dapat dicegah, karena dunia berubah antara tes dan tindakan. Apa yang dapat dilakukan program adalah menanggapi mereka ketika terjadi.
- Pelajaran ini adalah pengecualian, struktur TRY yang menangani satu, dan di mana dalam program pengecualian harus ditangkap.
Apa itu pengecualian dan mengapa menanganinya
- Pengecualian adalah kesalahan yang terjadi selama eksekusi: pembagian dengan nol, file tidak ditemukan, input tidak valid, jaringan yang telah hilang.
- Penanganan pengecualian memungkinkan program untuk mendeteksi kesalahan dan merespons secara terkendali, alih-alih mengalami crash dan kehilangan pekerjaan pengguna.
- Program nyata menghadapi kesalahan yang tidak dapat dicegah sebelumnya, seperti yang ditunjukkan oleh hook. Dan tanpa pengecualian, setiap operasi tunggal akan memerlukan pemeriksaan
IFsendiri di sekitarnya, sehingga menyamarkan algoritma sebenarnya dalam uji kesalahan. - Manfaat ketiga adalah yang paling sering ditanyakan dalam ujian: hal ini memisahkan alur normal dari penanganan kesalahan, sehingga jalur utama terbaca dengan jelas.
Sebuah pengecualian adalah:
Pengecualian adalah masalah waktu-jalan (pembagian dengan nol, file tidak ditemukan) yang penanganan memungkinkan Anda meresponsnya dengan baik.
Mengapa menggunakan penanganan pengecualian daripada memeriksa setiap kesalahan sebelumnya? Pilih semua yang berlaku.
Manfaatnya adalah ketepatan dan kejelasan. Kecepatan bukan salah satu manfaatnya; penanganan menambah sedikit beban kerja, yang layak untuk dibayar.
Struktur TRY
TRY
OPENFILE "data.txt" FOR READ
READFILE "data.txt", line
CLOSEFILE "data.txt"
EXCEPT FileNotFound
OUTPUT "Sorry, the file does not exist."
EXCEPT ReadError
OUTPUT "Sorry, there was an error reading the file."
FINALLY
OUTPUT "Finished attempting to read."
ENDTRY
- Blok TRY menyimpan kode yang mungkin gagal. Jika berjalan tanpa error, blok EXCEPT dilewati sepenuhnya.
- Jika terjadi pengecualian, eksekusi langsung melompat ke blok EXCEPT pertama yang cocok. Sisa dari blok TRY tidak akan berjalan.
- Blok FINALLY akan berjalan baik atau tidaknya terjadi pengecualian, sehingga tempat ini tepat untuk pembersihan seperti menutup file.

Satu jalur jika semua baik, jalur lain jika tidak, dan satu jalur yang selalu berjalan
Bagaimana alur penanganan pengecualian bekerja
Ikuti apa yang terjadi ketika kode gagal. Pengecualian melompat keluar dari alur normal menuju handler, FINALLY membersihkan baik-baik, dan program berlanjut alih-alih crash.
Cocokkan setiap kata kunci penanganan pengecualian dengan tugasnya.
TRY menjaga kode berisiko, EXCEPT menangkap, FINALLY membersihkan dalam kedua keadaan, RAISE melemparkan error agar ditangkap.
Blok FINALLY:
FINALLY selalu berjalan, menjadikannya ideal untuk pembersihan seperti menutup file.
Blok yang berjalan baik atau tidak terjadi pengecualian, menjadikannya tepat untuk menutup file, adalah ____.
Pembersihan harus terjadi di kedua jalur. Menempatkan CLOSEFILE hanya di blok TRY berarti dilewati persis saat kesalahan meninggalkan file tetap terbuka.
Contoh terpecahkan: telusuri alur
- Di kode di atas, file tidak ada. Jelaskan secara eksak apa yang ditampilkan dan apa yang dilewati.
OPENFILEmenyebabkan FileNotFound, sehingga eksekusi meninggalkan blok TRY secara instan: barisREADFILEdanCLOSEFILEtidak pernah dijalankan.- Blok EXCEPT
FileNotFoundberjalan, menampilkan "Sorry, the file does not exist." BlokReadErrortidak berjalan, karena hanya penangan pertama yang cocok yang digunakan. - Blok FINALLY berjalan, menampilkan "Finished attempting to read."
- Nilai yang paling sering hilang adalah menyadari bahwa sisa dari blok TRY ditinggalkan.
File dalam blok TRY tidak ada. Susunlah apa yang terjadi secara berurutan.
Hanya handler pertama yang cocok yang berjalan, dan FINALLY berjalan dalam kedua keadaan. Sisa blok TRY yang terlewat adalah tanda yang paling sering terlewatkan.
Memunculkan pengecualian
- Subrutin yang mendeteksi masalah yang tidak bisa ditangani dengan wajar dapat memicu (raise) pengecualian, mentransfer tanggung jawab kepada siapa pun yang memanggilnya:
IF b = 0 THEN RAISE DivideByZero
- Ini adalah desain yang tepat ketika subrutin tahu ada sesuatu yang salah tetapi tidak tahu apa yang harus dilakukan. Rutin pembagian tahu pembaginya nol; hanya pemanggil yang tahu apakah harus meminta pengguna lagi, menggunakan nilai default, atau membatalkan perhitungan.
Subrutin menggunakan RAISE untuk:
RAISE melemparkan pengecualian ke pemanggil, yang dapat menangkapnya dengan EXCEPT.
Mengapa subrutin pembagian RAISE pengecualian alih-alih menangani pembagi nol itu sendiri?
Minta pengguna lagi, gunakan default, atau tinggalkan perhitungan: hanya kode pemanggil memiliki konteks untuk memilih.
Di mana menanganinya
- Tangani pengecualian dekat dengan tempat terjadinya ketika responsnya sederhana dan lokal: cetak pesan, gunakan default, minta pengguna mencoba lagi.
- Tangani lebih tinggi ketika keputusan milik bagian program yang lebih besar: apakah membatalkan seluruh transaksi, membalikkan perubahan, atau memberi tahu pengguna operasi gagal.
- Aturan praktisnya: tangkap pada tingkat yang memiliki cukup informasi untuk memutuskan apa yang harus dilakukan, bukan pada tingkat yang pertama kali menyadarinya.
Contoh terpecahkan: apa yang tidak boleh dilakukan
- Seorang siswa menulis
EXCEPT: (do nothing)di sekitar seluruh program agar tidak pernah crash. Jelaskan mengapa ini merupakan praktik buruk. - Pengecualian tersebut diserap: program terus berjalan seolah-olah tidak ada yang salah, sehingga melanjutkan dengan data yang hilang atau tidak valid dan menghasilkan hasil yang salah alih-alih kegagalan yang jelas.
- Kegagalan sunyi sulit didiagnosis daripada crash, karena tidak ada pesan dan tidak ada indikasi di mana hal itu terjadi.
- Menangkap setiap pengecualian dalam satu tempat juga berarti jenis error spesifik hilang, sehingga respons yang masuk akal tidak dapat dipilih. Handler harus menangkap pengecualian spesifik dan benar-benar meresponsnya.
Diam "menelan" pengecualian (menangkapnya tetapi tidak melakukan apa-apa) menyembunyikan kesalahan nyata dan membuat debugging sulit — Anda harus menanganinya atau setidaknya mencatatnya.
Handler kosong menyembunyikan masalah yang sebenarnya perlu Anda temukan; selalu respons atau catat kesalahannya.
⟦⟧ Nilai yang sering terlewat
- Ketika pengecualian terjadi, sisa dari blok TRY dilewati. Sebutkan hal itu saat menelusuri.
- Hanya pertama yang cocok dari EXCEPT yang berjalan, bukan semuanya.
- FINALLY selalu berjalan, ada error atau tidak, inilah yang menjadikannya tepat untuk menutup file.
- Jangan tangkap pengecualian dan lakukan apa-apa. Kesalahan yang diserap lebih buruk daripada crash, karena program tetap berjalan dengan data yang buruk.
Anda telah memahaminya
- sebuah pengecualian adalah error waktu berjalan; menanganinya memungkinkan program bereaksi alih-alih crash, mencakup error yang tidak dapat dicegah sebelumnya, dan memisahkan kode normal dari penanganan error
- TRY menyimpan kode berisiko; pada error sisanya dilewati dan EXCEPT pertama yang cocok berjalan; FINALLY berjalan dalam kedua kondisi, jadi pembersihan berada di sana
- subrutin yang tidak dapat memutuskan respons harus MEMPICU pengecualian untuk pemanggilnya
- tangani dekat untuk respons lokal sederhana, lebih tinggi jika keputusan membutuhkan pandangan lebih luas; jangan pernah menangkapnya dan melakukan apa-apa