Menggunakan Penangan Pengecualian
Contoh berikut menunjukkan penggunaan handler pengecualian.
Contoh 1
Fragmen kode berikut menggunakan penanganan pengecualian terstruktur untuk memeriksa apakah operasi pembagian pada dua bilangan bulat 32-bit akan mengakibatkan kesalahan pembagian demi nol. Jika ini terjadi, fungsi mengembalikan FALSE— jika tidak, fungsi mengembalikan TRUE.
BOOL SafeDiv(INT32 dividend, INT32 divisor, INT32 *pResult)
{
__try
{
*pResult = dividend / divisor;
}
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
return FALSE;
}
return TRUE;
}
Contoh 2
Contoh fungsi berikut memanggil fungsi DebugBreak dan menggunakan penanganan pengecualian terstruktur untuk memeriksa pengecualian breakpoint. Jika terjadi, fungsi mengembalikan FALSE— jika tidak, fungsi mengembalikan TRUE.
Ekspresi filter dalam contoh menggunakan fungsiGetExceptionCode untuk memeriksa jenis pengecualian sebelum mengeksekusi handler. Ini memungkinkan sistem untuk melanjutkan pencariannya untuk handler yang sesuai jika beberapa jenis pengecualian lain terjadi.
Selain itu, penggunaan pernyataan pengembalian di blok __try handler pengecualian berbeda dari penggunaan pengembalian di blok __try handler penghentian, yang menyebabkan penghentian abnormal blok __try. Ini adalah penggunaan pernyataan pengembalian yang valid dalam handler pengecualian.
BOOL CheckForDebugger()
{
__try
{
DebugBreak();
}
__except(GetExceptionCode() == EXCEPTION_BREAKPOINT ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// No debugger is attached, so return FALSE
// and continue.
return FALSE;
}
return TRUE;
}
Hanya kembalikan EXCEPTION_EXECUTE_HANDLER dari filter pengecualian ketika jenis pengecualian diharapkan dan alamat yang menyebabkan kesalahan diketahui. Anda harus mengizinkan handler pengecualian default untuk memproses jenis pengecualian yang tidak terduga dan alamat kesalahan.
Contoh 3
Contoh berikut menunjukkan interaksi handler berlapis. FungsiRaiseException menyebabkan pengecualian dalam tubuh yang dijaga dari handler penghentian yang berada di dalam tubuh yang dijaga dari handler pengecualian. Pengecualian menyebabkan sistem mengevaluasi fungsi FilterFunction, yang nilai pengembaliannya pada gilirannya menyebabkan handler pengecualian dipanggil. Namun, sebelum blok penanganan pengecualian dijalankan, blok __finally dari penangan penghentian dijalankan karena aliran kontrol telah keluar dari blok __try dari penangan penghentian.
DWORD FilterFunction()
{
printf("1 "); // printed first
return EXCEPTION_EXECUTE_HANDLER;
}
VOID main(VOID)
{
__try
{
__try
{
RaiseException(
1, // exception code
0, // continuable exception
0, NULL); // no arguments
}
__finally
{
printf("2 "); // this is printed second
}
}
__except ( FilterFunction() )
{
printf("3\n"); // this is printed last
}
}