Ini fakta menarik: Tidak kode bebas dari kesalahan - pada kenyataannya, beberapa kode penuh dengan "kesalahan" dengan sengaja.
Apa kesalahan dalam aplikasi? Kesalahan adalah solusi kode yang salah untuk masalah. Seperti itu kesalahan logika yang dapat menyebabkan hasil fungsi yang salah di mana semuanya tampak disatukan tetapi hasil aplikasi benar-benar tidak dapat digunakan. Dengan kesalahan logika, sebuah aplikasi mungkin atau mungkin tidak berhenti bekerja.
Pengecualian dapat mencakup kesalahan dalam kode Anda di mana Anda mencoba untuk membagi angka dengan nol, atau Anda mencoba menggunakan blok memori yang dibebaskan atau mencoba memberikan parameter yang salah ke suatu fungsi. Namun, pengecualian dalam aplikasi tidak selalu merupakan kesalahan.
Pengecualian dan Kelas Pengecualian
Pengecualian adalah kondisi khusus yang memerlukan penanganan khusus. Ketika kondisi tipe kesalahan terjadi, program memunculkan pengecualian.
Anda (sebagai penulis aplikasi) akan menangani pengecualian untuk membuat aplikasi Anda lebih rentan kesalahan dan untuk menanggapi kondisi luar biasa.
Dalam kebanyakan kasus, Anda akan menemukan diri Anda menjadi penulis aplikasi dan juga penulis perpustakaan. Jadi, Anda perlu tahu cara mengajukan pengecualian (dari perpustakaan Anda) dan cara menanganinya (dari aplikasi Anda).
Artikel tentang menangani kesalahan dan pengecualian memberikan beberapa pedoman dasar tentang cara melindungi dari kesalahan menggunakan blok coba / pengecualian / akhir dan coba / akhirnya / akhir yang dilindungi untuk merespons atau menangani kondisi luar biasa.
Coba / kecuali menjaga blok terlihat seperti:
mencoba
ThisFunctionMightRaiseAnException ();
kecuali// menangani pengecualian apa pun yang muncul di ThisFunctionMightRaiseAnException () di sini
akhir;
The ThisFunctionMightRaiseAnException mungkin memiliki, dalam implementasinya, garis kode seperti
menaikkan Pengecualian. Buat ('kondisi khusus!');
Pengecualian adalah kelas khusus (satu dari beberapa tanpa T di depan nama) yang didefinisikan dalam unit sysutils.pas. Unit SysUtils mendefinisikan beberapa keturunan Exception tujuan khusus (dan karenanya menciptakan sebuah hierarki kelas pengecualian) seperti ERangeError, EDivByZero, EIntOverflow, dll.
Dalam kebanyakan kasus, pengecualian yang akan Anda tangani di blok coba / kecuali yang dilindungi tidak akan menjadi pengecualian (basis) kelas tetapi dari beberapa kelas turunan Pengecualian khusus yang didefinisikan dalam VCL atau di perpustakaan Anda menggunakan.
Menangani Pengecualian Menggunakan Try / Kecuali
Untuk menangkap dan menangani tipe pengecualian, Anda akan membangun sebuah penangan pengecualian "on type_of_exception do". The "on exception do" sangat mirip dengan pernyataan kasus klasik:
mencoba
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// sesuatu saat membaginya dengan nolakhir;
di EIntOverflow dobegin// sesuatu ketika perhitungan bilangan bulat terlalu besarakhir;
elsebegin// sesuatu ketika tipe pengecualian lain dimunculkanakhir;
akhir;
Perhatikan bahwa bagian lain akan mengambil semua pengecualian (lainnya), termasuk yang tidak Anda ketahui. Secara umum, kode Anda harus menangani hanya pengecualian yang benar-benar Anda tahu cara menangani dan berharap untuk dibuang.
Selain itu, Anda tidak boleh "memakan" pengecualian:
mencoba
ThisFunctionMightRaiseAnException;
kecuali
akhir;
Makan pengecualian berarti Anda tidak tahu cara menangani pengecualian atau Anda tidak ingin pengguna melihat pengecualian atau apa pun di antaranya.
Ketika Anda menangani pengecualian dan Anda membutuhkan lebih banyak data dari itu (setelah semua itu adalah turunan dari kelas) bukan hanya jenis pengecualian yang dapat Anda lakukan:
mencoba
ThisFunctionMightRaiseAnException;
excepton E: Pengecualian dobegin
ShowMessage (E.Message);
akhir;
akhir;
"E" dalam "E: Exception" adalah variabel pengecualian sementara dari tipe yang ditentukan setelah karakter kolom (dalam contoh di atas kelas Exception dasar). Menggunakan E Anda dapat membaca (atau menulis) nilai-nilai ke objek pengecualian, seperti mendapatkan atau mengatur properti Pesan.
Siapa yang membebaskan pengecualian?
Pernahkah Anda memperhatikan bagaimana pengecualian sebenarnya adalah contoh dari kelas yang turun dari Pengecualian? Meningkatkan kata kunci melempar instance kelas pengecualian. Apa yang Anda buat (contoh pengecualian adalah objek), Anda juga perlu gratis. Jika Anda (sebagai penulis perpustakaan) membuat sebuah instance, apakah pengguna aplikasi akan membebaskannya?
Inilah Delphi magic: Menangani exception secara otomatis menghancurkan objek exception. Ini berarti bahwa ketika Anda menulis kode di blok "kecuali / akhir", itu akan melepaskan memori pengecualian.
Jadi apa yang terjadi jika ThisFunctionMightRaiseAnException benar-benar menimbulkan pengecualian dan Anda tidak menanganinya (ini tidak sama dengan "memakannya")?
Bagaimana dengan Saat Angka / 0 Tidak Ditangani?
Ketika pengecualian yang tidak ditangani dilemparkan ke dalam kode Anda, Delphi sekali lagi secara ajaib menangani pengecualian Anda dengan menampilkan dialog kesalahan kepada pengguna. Dalam kebanyakan kasus, dialog ini tidak akan memberikan data yang cukup bagi pengguna (dan akhirnya Anda) untuk memahami penyebab pengecualian.
Ini dikendalikan oleh loop pesan tingkat atas Delphi di mana semua pengecualian sedang diproses oleh objek Aplikasi global dan metode HandleException-nya.
Untuk menangani pengecualian secara global, dan menampilkan dialog Anda yang lebih ramah pengguna, Anda dapat menulis kode untuk TApplicationEvents. Penangan event OnException.
Perhatikan bahwa objek Aplikasi global didefinisikan dalam unit Formulir. TApplicationEvents adalah komponen yang dapat Anda gunakan untuk mencegat peristiwa objek Aplikasi global.