PENGANTAR
Exception(Pengecualian) adalah suatu peristiwa yang terjadi
selama pelaksanaan program, dan membutuhkan eksekusi kode luar aliran normal
kontrol. Ada dua jenis pengecualian: pengecualian hardware dan software
pengecualian. Pengecualian Hardware yang diprakarsai oleh CPU. Mereka dapat
hasil dari eksekusi urutan instruksi tertentu, seperti pembagian dengan nol
atau usaha untuk mengakses alamat memori yang tidak valid. Pengecualian
Software yang dimulai secara eksplisit oleh aplikasi atau sistem operasi.
Sebagai contoh, sistem dapat mendeteksi ketika nilai parameter tidak valid
ditentukan.Structured
Exception handling adalah suatu mekanisme untuk menangani
hardware dan software pengecualian. Oleh karena itu, kode Anda akan menangani
perangkat keras dan perangkat lunak pengecualian identik. Penanganan eksepsi
terstruktur memungkinkan Anda untuk memiliki kontrol penuh atas penanganan
pengecualian, menyediakan dukungan untuk debugger, dan dapat digunakan di semua
bahasa pemrograman dan mesin. Pengecualian penanganan vektor adalah perluasan
untuk penanganan eksepsi terstruktur.Sistem ini juga mendukung penanganan
terminasi, yang memungkinkan Anda untuk memastikan bahwa setiap kali tubuh
dijaga kode dijalankan, sebuah blok tertentu dari kode terminasi juga
dieksekusi. Kode terminasi dijalankan terlepas dari bagaimana aliran kontrol
meninggalkan tubuh dijaga. Misalnya, penangan terminasi dapat menjamin bahwa
tugas bersih-bersih dilakukan bahkan jika pengecualian atau beberapa error lain
terjadi ketika tubuh dijaga kode yang sedang dieksekusi.
Terstruktur pengecualian penanganan dan mekanisme penanganan
terminasi merupakan bagian integral dari sistem, mereka memungkinkan sistem
untuk menjadi kuat. Anda dapat menggunakan mekanisme ini untuk membuat aplikasi
secara konsisten kuat dan dapat diandalkan.Structured exception handling dibuat
tersedia terutama melalui dukungan compiler. Sebagai contoh, Microsoft C / C +
+ Mengoptimalkan Compiler mendukung __ mencoba kata kunci yang mengidentifikasi
tubuh dijaga kode, __ kecuali kata kunci yang mengidentifikasi pengecualian
handler, dan __ akhirnya kata kunci yang mengidentifikasi handler terminasi.
Meskipun gambaran ini menggunakan contoh-contoh spesifik untuk Microsoft C / C
+ + compiler, compiler lain memberikan dukungan ini juga.
Pengecualian dapat dimulai oleh perangkat keras atau
perangkat lunak, dan dapat terjadi pada kernel-mode serta kode mode pengguna.
Penanganan eksepsi terstruktur menyediakan mekanisme tunggal untuk penanganan
kernel-mode dan user-mode pengecualian.Pelaksanaan urutan instruksi tertentu
dapat mengakibatkan pengecualian yang diprakarsai oleh hardware. Misalnya,
pelanggaran akses yang dihasilkan oleh perangkat keras ketika proses mencoba
untuk membaca dari atau menulis ke alamat virtual yang tidak memiliki akses
yang tepat. Acara yang memerlukan penanganan eksepsi juga dapat terjadi selama
proses eksekusi rutin perangkat lunak (misalnya, ketika sebuah nilai parameter
tidak valid ditentukan). Ketika ini terjadi, benang dapat memulai pengecualian
eksplisit dengan memanggil fungsi RaiseException. Fungsi ini memungkinkan
benang menelepon untuk menentukan informasi yang menggambarkan pengecualian. Pengecualian
bisa berlanjut atau noncontinuable. Pengecualian noncontinuable muncul ketika
acara tersebut tidak berlanjut di hardware, atau jika kelanjutan tidak masuk
akal. Pengecualian noncontinuable tidak mengakhiri aplikasi. Oleh karena itu,
aplikasi mungkin dapat menangkap pengecualian dan menjalankan. Namun,
pengecualian noncontinuable biasanya muncul sebagai akibat dari tumpukan rusak
atau masalah serius lainnya, sehingga sulit untuk pulih dari pengecualian.
Penanganan sistem pengecualian mode pengguna menyediakan
dukungan untuk debugger canggih. Jika proses di mana pengecualian terjadi
sedang debugged, sistem menghasilkan acara debug. Jika debugger menggunakan
fungsi WaitForDebugEvent, acara debug menyebabkan bahwa fungsi untuk kembali
dengan pointer ke struktur DEBUG_EVENT. Struktur ini berisi proses dan pengenal
benang debugger dapat digunakan untuk mengakses catatan konteks thread.
Struktur ini juga mengandung struktur EXCEPTION_DEBUG_INFO yang mencakup
salinan dari catatan pengecualian.Ketika sistem mencari pengecualian handler,
itu membuat dua upaya untuk memberitahukan debugger proses itu. Upaya pemberitahuan
pertama menyediakan debugger dengan kesempatan untuk menangani breakpoint atau
pengecualian satu langkah. Ini dikenal sebagai pemberitahuan pertama-kebetulan.
Pengguna kemudian dapat mengeluarkan perintah debugger untuk memanipulasi
lingkungan proses itu sebelum penangan pengecualian dieksekusi. Upaya kedua
untuk memberitahu debugger hanya terjadi jika sistem tidak dapat menemukan
handler pengecualian berbasis frame yang menangani pengecualian. Ini dikenal
sebagai pemberitahuan-kesempatan terakhir. Jika debugger tidak menangani
pengecualian setelah pemberitahuan-kesempatan terakhir, sistem mengakhiri
proses yang sedang debugged.Pada setiap upaya pemberitahuan, debugger
menggunakan fungsi ContinueDebugEvent untuk mengembalikan kontrol ke sistem. Sebelum
kembali kontrol, debugger dapat menangani pengecualian dan memodifikasi negara
thread yang sesuai, atau dapat memilih untuk tidak menangani pengecualian.
Menggunakan ContinueDebugEvent, debugger dapat menunjukkan bahwa ia telah
menangani pengecualian, dalam hal keadaan mesin dipulihkan dan eksekusi thread
dilanjutkan pada titik di mana pengecualian terjadi. Debugger juga dapat
menunjukkan bahwa itu tidak menangani pengecualian, yang menyebabkan sistem
untuk melanjutkan pencarian untuk pengecualian handler.
Tujuan Sebuah aplikasi dapat menggunakan aplikasi Pemulihan
dan Restart (ARR) untuk menyimpan data dan informasi negara sebelum keluar
aplikasi karena eksepsi tidak tertangani atau ketika aplikasi berhenti
merespons. Aplikasi ini juga ulang, jika diminta.Sebuah aplikasi juga bisa
restart jika installer update komponen dari aplikasi, atau jika komputer perlu
me-restart sebagai hasil dari update. Perhatikan bahwa untuk mendukung
me-restart aplikasi otomatis setelah update installer aplikasi, baik aplikasi
dan installer harus ditulis dengan tepat. Untuk rincian, lihat Pendaftaran
untuk Restart Aplikasi.penonton PengembangARR dirancang untuk C dan C + +
pengembang.Persyaratan Run-timeARR tersedia mulai dengan sistem operasi Windows
Vista.
Sebuah aplikasi dapat menggunakan aplikasi Pemulihan dan
Restart (ARR) untuk menyimpan data dan informasi negara sebelum keluar aplikasi
karena eksepsi tidak tertangani atau ketika aplikasi berhenti merespons.
Aplikasi ini juga ulang, jika diminta.Ketika Anda mendaftar untuk pemulihan
atau restart, informasi pendaftaran akan ditambahkan ke proses. Windows Error
Reporting (Wer) menggunakan informasi pendaftaran untuk memanggil callback
pemulihan dan restart aplikasi Anda. Misalnya, jika Anda mendaftar untuk
pemulihan dan aplikasi Anda menemukan sebuah eksepsi tidak tertangani, Wer
menampilkan dialog untuk pengguna yang memberikan pengguna pilihan untuk
memeriksa solusi online, menutup program, atau debugging program. Jika pengguna
memilih untuk langsung memeriksanya untuk solusi atau menutup program, Wer
memanggil callback terdaftar dan memberikan aplikasi kesempatan untuk menyimpan
data dan informasi negara. Ketika pemulihan selesai, aplikasi diakhiri.Jika
Anda mendaftar untuk restart dan aplikasi Anda menemukan sebuah eksepsi tidak
tertangani, Wer menampilkan dialog yang sama kepada pengguna tetapi memberikan
pilihan untuk me-restart program bukan menutup program. Jika Anda mendaftar
untuk kedua pemulihan dan restart, pemulihan lebih cepat terjadi; aplikasi ini
kemudian dihentikan dan dimulai kembali.Sebuah aplikasi responsif ditangani
dengan cara yang sama. Sebuah aplikasi dianggap tidak responsif jika tidak
merespon Windows pesan selama lima detik dan pengguna kemudian mencoba untuk
berinteraksi dengan aplikasi tersebut, pengguna akan melihat (Tidak Menanggapi)
dalam judul bar. WER diaktifkan ketika pengguna mengklik tombol sistem
tertutup.Anda harus mendaftar untuk pemulihan atau restart, atau menghapus
pendaftaran, sebelum aplikasi menjadi tidak responsif atau pertemuan unhandled
pengecualian. Namun, dalam callback pemulihan Anda, Anda dapat mengubah baris
perintah restart.
Untuk
rincian tentang mendaftar untuk pemulihan atau restart, lihat topik berikut:
Bagian ini
memberikan rincian tentang menerapkan fitur pemulihan dalam aplikasi Anda. Anda
harus mempertimbangkan untuk menerapkan fitur ini untuk menangani kasus-kasus
berikut:Memulihkan ketika aplikasi mengalami unhandled pengecualian atau
berhenti meresponsMencegah hilangnya data saat aplikasi tiba-tiba berhenti bekerja.Menyimpan
data dan kondisi aplikasi saat aplikasi sedang ditutup karena pembaruan
perangkat lunakMemungkinkan pengguna untuk mulus kembali data aplikasi ketika
aplikasi ditutup karena instalasi software update (yang mungkin terjadi tanpa
memberikan pengguna kesempatan untuk menyimpan data).Memulihkan ketika aplikasi
mengalami unhandled pengecualian atau berhenti meresponsUntuk mendaftarkan
callback pemulihan, memanggil fungsi RegisterApplicationRecoveryCallback.
Windows Error Reporting (Wer) panggilan panggilan balik pemulihan Anda sebelum
aplikasi keluar karena eksepsi tidak tertangani atau aplikasi tidak
menanggapi. Anda menggunakan callback pemulihan untuk mencoba untuk
menyimpan data dan informasi negara sebelum aplikasi berakhir. Anda kemudian dapat
menggunakan data yang disimpan dan informasi negara saat aplikasi
di-restart.Selama proses pemulihan, Anda harus memanggil fungsi
ApplicationRecoveryInProgress dalam interval ping tertentu, jika tidak, proses
pemulihan dihentikan. Memanggil ApplicationRecoveryInProgress memungkinkan Wer
tahu bahwa Anda masih aktif memulihkan data. Ketika proses pemulihan selesai,
memanggil fungsi ApplicationRecoveryFinished. Perhatikan bahwa fungsi
ApplicationRecoveryFinished harus menjadi panggilan terakhir yang Anda lakukan
sebelum keluar karena fungsi segera berakhir aplikasi.Anda harus
mempertimbangkan secara berkala menyimpan salinan sementara dari data dan
informasi negara selama normal dari proses aplikasi. Berkala menyimpan data
dapat menghemat waktu dalam proses pemulihan.Menyimpan data dan kondisi
aplikasi saat aplikasi sedang ditutup karena pembaruan perangkat lunakJika
sebuah aplikasi Windows dapat diperbarui, aplikasi juga harus memproses
WM_QUERYENDSESSION dan pesan WM_ENDSESSION. Installer mengirimkan pesan ini ketika
installer membutuhkan aplikasi untuk shutdown untuk menyelesaikan instalasi
atau saat reboot diperlukan untuk menyelesaikan instalasi. Perhatikan bahwa
dalam kasus ini, aplikasi memiliki sedikit waktu untuk melakukan recovery.
Misalnya, aplikasi tersebut harus merespon setiap pesan dalam waktu lima
detik.Untuk aplikasi konsol yang dapat diperbarui, Anda harus mempertimbangkan
penanganan pemberitahuan CTRL_C_EVENT. Sebagai contoh, lihat Pendaftaran untuk
Restart Aplikasi. Installer mengirimkan pemberitahuan ini ketika membutuhkan
aplikasi untuk shutdown untuk menyelesaikan pembaruan. Aplikasi ini memiliki 30
detik untuk menangani pemberitahuan.Contoh berikut menunjukkan bagaimana cara
mendaftar untuk pemulihan, implementasi callback pemulihan sederhana, dan
bagaimana memproses pesan-pesan WM_QUERYENDSESSION dan WM_ENDSESSION
ERROR HANDLING
·
Error Mode
Modus kesalahan ini menunjukkan ke
sistem bagaimana aplikasi akan menanggapi kesalahan serius. Kesalahan serius
termasuk kegagalan disk, kesalahan drive-tidak-siap, misalignment data, dan
pengecualian tertangani. Modus Kesalahan ini dapat dikelola oleh baik
per-benang atau per-proses dasar. Sebuah aplikasi dapat membiarkan sistem
menampilkan kotak pesan yang memberitahu pengguna bahwa kesalahan telah
terjadi, atau dapat menangani kesalahan.Untuk menangani kesalahan ini tanpa
campur tangan pengguna, gunakan SetErrorMode atau SetThreadErrorMode benang
khusus. Setelah memanggil salah satu fungsi dan menetapkan bendera yang tepat,
sistem tidak akan menampilkan kotak pesan kesalahan yang sesuai.Sebuah proses
dapat mengambil modus kesalahan dengan menggunakan GetErrorMode atau
GetThreadErrorMode.Praktik terbaik adalah bahwa semua aplikasi memanggil fungsi
SetErrorMode proses-lebar dengan parameter SEM_FAILCRITICALERRORS saat startup.
Hal ini untuk mencegah kesalahan dari dialog modus tergantung aplikasi.Selain
itu, penelepon harus mendukung versi benang-spesifik fungsi-fungsi karena
mereka kurang mengganggu perilaku normal dari sistem.
· Last-Error
Code
Bila terjadi kesalahan, fungsi sistem
yang paling mengembalikan kode kesalahan, biasanya 0, NULL, atau -1. Banyak
fungsi sistem juga menetapkan kode kesalahan tambahan yang disebut
kode-kesalahan terakhir. Kode kesalahan ini dipertahankan secara terpisah untuk
setiap thread berjalan, kesalahan dalam satu thread tidak menimpa kode
kesalahan terakhir di thread lain. Setiap fungsi dapat memanggil SetLastError
atau fungsi SetLastErrorEx untuk mengatur kode-kesalahan terakhir untuk thread
saat ini. Fungsi-fungsi dimaksudkan terutama untuk perpustakaan dynamic link
(DLL), sehingga mereka dapat memberikan informasi kepada aplikasi yang
memanggil. Perhatikan bahwa beberapa fungsi panggilan SetLastError atau
SetLastErrorEx dengan 0 ketika mereka berhasil, menghapus kode kesalahan yang
ditetapkan oleh fungsi yang paling baru-baru ini gagal, sementara yang lainnya
tidak.Sebuah aplikasi dapat mengambil kode-kesalahan terakhir dengan
menggunakan fungsi GetLastError, kode kesalahan mungkin mengatakan lebih banyak
tentang apa yang sebenarnya terjadi untuk membuat fungsi gagal. Dokumentasi
untuk fungsi sistem akan menunjukkan kondisi di mana fungsi menetapkan
kode-kesalahan terakhir.Sistem ini mendefinisikan satu set kode kesalahan yang
dapat ditetapkan sebagai kode-kesalahan terakhir atau dikembalikan oleh fungsi
tersebut. Kode kesalahan adalah nilai-nilai 32-bit (bit 31 adalah bit yang
paling signifikan). Bit 29 dicadangkan untuk didefinisikan aplikasi kode
kesalahan, tidak ada kode kesalahan sistem memiliki sedikit set ini. Jika anda
mendefinisikan kode kesalahan untuk aplikasi Anda, mengatur sedikit ini untuk
menunjukkan bahwa kode kesalahan telah didefinisikan oleh aplikasi dan
memastikan bahwa kode kesalahan tidak bertentangan dengan kode kesalahan
didefinisikan sistem. Untuk informasi lebih lanjut, lihat winerror.h dan Sistem
Kode Kesalahan.
· Notifying
the User
Untuk memberitahu pengguna bahwa
beberapa jenis kesalahan telah terjadi, banyak aplikasi hanya menghasilkan
suara dengan menggunakan fungsi MessageBeep atau berkedip jendela dengan
menggunakan salah satu FlashWindow atau fungsi FlashWindowEx. Sebuah aplikasi
juga dapat menggunakan fungsi-fungsi untuk memperhatikan kesalahan dan kemudian
menampilkan kotak pesan atau pesan kesalahan yang berisi rincian tentang
kesalahan.
· Tabel
Pesan
Tabel pesan adalah sumber daya khusus string
yang digunakan ketika menampilkan pesan kesalahan. Mereka dinyatakan dalam file
sumber daya menggunakan pernyataan sumber-definisi MESSAGETABLE. Untuk
mengakses string pesan, gunakan fungsi FormatMessage.Sistem ini menyediakan
meja pesan untuk kode kesalahan sistem. Untuk mengambil string yang sesuai
dengan kode kesalahan, panggilan FormatMessage dengan bendera
FORMAT_MESSAGE_FROM_SYSTEM.Untuk menyediakan meja pesan untuk aplikasi Anda,
ikuti petunjuk dalam pesan teks File. Untuk mengambil string dari meja pesan
Anda, hubungi FormatMessage dengan bendera FORMAT_MESSAGE_FROM_HMODULE.
· Fatal
Application Exit
Fungsi FatalAppExit menampilkan kotak pesan
dan berakhir aplikasi ketika pengguna menutup kotak pesan. Fungsi ini
seharusnya hanya digunakan sebagai pilihan terakhir, karena mungkin tidak
membebaskan memori atau file yang dimiliki oleh aplikasi.
Sumber Refrensi:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee663269(v=vs.85).aspx