Riwayat pembaruan: No.2
Waktu pembaruan: 21-10-2001 02:42
Diperbarui oleh: Musicwind®
Catatan pembaruan: Format yang dimodifikasi.
Riwayat pembaruan: No.1
Waktu pembaruan: 2001-10-19 21:15
Diperbarui oleh: Musicwind®
Perbarui Catatan: Dibuat.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
Kata Pengantar: Saya telah mendalami Delphi selama lebih dari tiga tahun, tetapi setiap kali saya membaca dokumentasi bantuan Delphi, saya masih mendapatkan banyak hal, jadi saya hanya bisa menghela nafas betapa luasnya Delphi! Sementara aku merasa malu, aku akan memilah beberapa pengalaman dan perolehanku, dan membagikan semangatku kepada kalian yang sombong dan kurang berilmu seperti aku.
1. Apa yang dimaksud dengan pengecualian diam? (Mengapa tidak Keheningan Anak Domba? ;- ))
Pengecualian senyap, yaitu Slient Exceptions , mengacu pada jenis pengecualian yang tidak menyebabkan pesan yang mengganggu secara default: EAbort . Dalam Object Pascal, kelas pengecualian EAbort adalah kelas leluhur dari semua kelas pengecualian diam (dan EAbort mewarisi Exception). Menaikkan EAbort akan menyebabkan modul eksekusi berhenti hingga modul penanganan pengecualian terluar mencegatnya, namun tidak akan menyebabkan kotak pesan dengan tanda berhenti berwarna merah muncul. Lihat kode berikut:
mencoba
TampilkanPesan('Halo1');
Naikkan EAbort.Create('Batalkan');
TampilkanPesan('Halo2');
kecuali
di E: Pengecualian lakukan
showmessage('Pada Pengecualian');
akhir;
Hasil eksekusi menampilkan dua kotak pesan, satu adalah "Hello1" dan yang lainnya adalah "On Exception". Ini menunjukkan bahwa EAbort berfungsi, karena melewatkan pernyataan "ShowMessage('Hello2')"; pada saat yang sama, kotak pesan "Batalkan" tidak muncul, yang juga menegaskan fitur kelas pengecualian EAbort yang tidak ada dialog kotak muncul. (Ini juga berlaku selama desain); dan, kotak pesan "Pada Pengecualian" menunjukkan bahwa meskipun EAbort mungkin merupakan anomali yang berbeda dari pengecualian biasa, hal ini tidak menghalangi kita untuk menggunakan pernyataan Coba-Kecuali yang lama untuk menangkapnya. .
2. Mengapa menggunakan EAbort ?
EAbort berguna dalam situasi tertentu. Misalnya, ketika kita perlu menghentikan suatu operasi tetapi tidak ingin pengguna menyadarinya (kita tidak ingin mereka melihat kotak pesan pengecualian default). Tentu saja, untuk mencapai efek yang sama, Anda juga dapat menggunakan pengecualian biasa (misalnya, gunakan pola kalimat Coba-Kecuali, letakkan kode di bagian Coba, naikkan pengecualian jika Anda perlu menghentikan operasi, dan jangan menulis kode apa pun di bagian Kecuali), Namun tidak ada yang sesederhana dan langsung seperti menggunakan EAbort.
3. Apakah ada yang lebih sederhana? --Menggunakan proses Batalkan
Abort, sebuah proses yang didefinisikan dalam unit SysUtils, memungkinkan kita menggunakan EAbort dengan nyaman. Lihat kode sumber implementasi Abort:
Prosedur Batal;
fungsi ReturnAddr: Penunjuk;
asm
PINDAHKAN EAX,[EBP+4]
akhir;
mulai
naikkan EAbort.Create(SOperationAborted) di ReturnAddr;
akhir;
SOperationAborted di sini biasanya "Operasi dibatalkan".
4. Angkat tabir - prinsip implementasi
Mungkin kalian seperti saya penasaran kenapa EAbort diam saja. Apa yang Delphi lakukan terhadap EAbort secara internal? Mari kita cari tahu bersama.
Buka proyek baru, klik Temukan di File, masukkan kata kunci "EAbort", lalu pilih tombol radio Cari di Direktori, dan setel kotak edit File Mask di Opsi Direktori Pencarian ke nama direktori tempat kode sumber Delphi berada (seperti seperti milik saya Ya: D:Program FilesBorlandDelphi6Source), dan jangan lupa centang Sertakan SubDirektori. Terakhir, klik "OK" untuk memulai pencarian.
Hasilnya, kami menemukan ada sebanyak 17 tempat di kode sumber Delphi yang terkait dengan EAbort. Kecuali dua deklarasi EAbort dan beberapa pernyataan komentar di unit Sysutils, kami menemukan bahwa sebagian besar kodenya mirip dengan:
jika Kecuali Objek adalah EAbort maka
maupun:
jika tidak (E adalah EAbort) maka
dll.
Semuanya punya perlakuan khusus untuk EAbort berbasis RTTI - ternyata implementasi EAbort sesederhana itu!
Dua unit yang patut diperhatikan adalah: Formulir (versi Linux adalah QForms) dan AppEvnts. Lebih mudah untuk menemukan jawaban atas pertanyaan dalam kode yang pertama. Lihat kode sumber Delphi:
prosedur Tapplication.HandleException(Pengirim: TObject);
mulai
jika GetCapture <> 0 maka SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
jika Kecuali Objek adalah Pengecualian maka
mulai
jika tidak (ExceptObject adalah EAbort) maka
jika Ditugaskan(FOnException) lalu
FOnException(Pengirim, Pengecualian(ExceptObject))
kalau tidak
ShowException(Pengecualian(ExceptObject));
akhiri yang lain
SysUtils.ShowException(ExceptObject,ExceptionAddr);
akhir;
5. Perbedaan antara Batalkan , Istirahat, dan Keluar
Batalkan, Istirahat, dan Keluar agak mirip, namun sangat berbeda. Break digunakan untuk keluar dari loop dalam pernyataan loop. Keluar digunakan untuk melompat keluar dari badan fungsi yang sedang dijalankan (atau badan proses). Abort memungkinkan Anda melompat keluar dari satu atau lebih lapisan kode hingga kode penangkap pengecualian menangkapnya.
6. Sesuaikan pengecualian senyap
Sama seperti mendeklarasikan subkelas dari kelas pengecualian normal, buat saja EAbort dan subkelasnya sebagai kelas leluhur:
TMyException = Kelas(EAbort);
TNextException = Kelas(EAbort);
dll.
Musicwind®@HangZhou.Zhejiang.China
20-10-2001
Lebih banyak artikel
[ Akhir artikel]