Bagikan melalui


Menggunakan Penangan Pengecualian

Contoh berikut menunjukkan penggunaan handler pengecualian.

Beberapa contoh menggunakan fungsi GetExceptionCode dalam ekspresi filter __except untuk memeriksa jenis pengecualian sebelum menjalankan handler. Ini memungkinkan sistem untuk melanjutkan pencariannya untuk handler yang sesuai jika beberapa jenis pengecualian lain terjadi.

Secara umum, hanya kembalikan EXCEPTION_EXECUTE_HANDLER dari filter pengecualian ketika jenis pengecualian diharapkan dan alamat kesalahan sudah diketahui. Anda harus mengizinkan handler pengecualian default untuk memproses jenis pengecualian yang tidak terduga dan alamat kesalahan.

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 titik henti. Jika terjadi, itu berarti bahwa pengecualian tidak ditangani oleh debugger, dan fungsi mengembalikan FALSE— jika tidak, fungsi mengembalikan TRUE.

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;
}

Contoh 3

Contoh berikut menunjukkan interaksi handler berlapis. Fungsi RaiseException menyebabkan pengecualian dalam bagian yang dilindungi dari pengendali penghentian yang berada di dalam bagian yang dilindungi dari pengendali pengecualian. Pengecualian menyebabkan sistem mengevaluasi fungsi FilterFunction, yang nilai pengembaliannya pada gilirannya menyebabkan handler pengecualian dipanggil. Namun, sebelum blok penangan pengecualian dijalankan, blok __finally dari penangan penghentian dijalankan karena alur kontrol telah meninggalkan 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 
    } 
}