Sintaks Penghentian-Handler
Kata kunci __try dan __finally digunakan untuk membuat handler penghentian. Contoh berikut menunjukkan struktur handler penghentian.
__try
{
// guarded body of code
}
__finally
{
// __finally block
}
Misalnya, lihat Menggunakan Penghandel Penghentian.
Seperti halnya handler pengecualian, blok __try dan blok __finally memerlukan kurung kurawal ({}), dan menggunakan pernyataan goto untuk melompat ke salah satu blok tidak diizinkan.
Blok __try berisi isi kode yang dijaga yang dilindungi oleh handler penghentian. Fungsi dapat memiliki sejumlah handler penghentian, dan blok penanganan penghentian ini dapat disarangkan dalam fungsi yang sama atau dalam fungsi yang berbeda.
Blok __finally dijalankan setiap kali alur kontrol meninggalkan blok __try . Namun, blok __finally tidak dijalankan jika Anda memanggil salah satu fungsi berikut dalam blok __try: ExitProcess, ExitThread, atau batalkan.
Blok __finally dijalankan dalam konteks fungsi tempat handler penghentian berada. Ini berarti bahwa blok __finally dapat mengakses variabel lokal fungsi tersebut. Eksekusi blok __finally dapat dihentikan dengan salah satu cara berikut.
- Eksekusi pernyataan terakhir dalam blok dan kelanjutan ke instruksi berikutnya
- Penggunaan pernyataan kontrol (return, break, continue, atau goto)
- Penggunaan longjmp atau lompat ke handler pengecualian
Jika eksekusi blok __try berakhir karena pengecualian yang memanggil blok penanganan pengecualian dari handler pengecualian berbasis bingkai, blok __finally dijalankan sebelum blok penanganan pengecualian dijalankan. Demikian pula, panggilan ke fungsi pustaka run-time C longjmp dari blok __try menyebabkan eksekusi blok __finally sebelum eksekusi dilanjutkan pada target operasi longjmp . Jika __try eksekusi blok berakhir karena pernyataan kontrol (pengembalian, pemutusan, lanjutkan, atau goto), blok __finally dijalankan.
Fungsi AbnormalTermination dapat digunakan dalam blok __finally untuk menentukan apakah blok __try dihentikan secara berurutan — yaitu, apakah mencapai kurung kurawal penutup (}). Meninggalkan blok __try karena panggilan ke longjmp, lompat ke handler pengecualian, atau pernyataan return, break, continue, atau goto, dianggap sebagai penghentian abnormal. Perhatikan bahwa kegagalan untuk mengakhiri secara berurutan menyebabkan sistem mencari melalui semua bingkai tumpukan secara berurutan untuk menentukan apakah ada penangan penghentian yang harus dipanggil. Hal ini dapat mengakibatkan penurunan performa karena eksekusi ratusan instruksi.
Untuk menghindari penghentian abnormal penangan penghentian, eksekusi harus berlanjut ke akhir blok. Anda juga dapat menjalankan pernyataan __leave . Pernyataan __leave memungkinkan penghentian segera blok __try tanpa menyebabkan penghentian abnormal dan penalti performanya. Periksa dokumentasi pengkompilasi Anda untuk menentukan apakah pernyataan __leave didukung.
Jika eksekusi blok __finally berakhir karena pernyataan kontrol pengembalian , itu setara dengan goto dengan kurung kurawal penutup dalam fungsi penutup. Oleh karena itu, fungsi penutup akan kembali.