Bagikan melalui


Menggunakan Handler 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 titik henti. Jika terjadi, fungsi mengembalikan FALSE— jika tidak, fungsi mengembalikan TRUE.

Ekspresi filter dalam contoh menggunakan fungsi GetExceptionCode untuk memeriksa jenis pengecualian sebelum menjalankan 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 saat jenis pengecualian diharapkan dan alamat yang rusak 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. Fungsi RaiseException menyebabkan pengecualian dalam isi 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 handler pengecualian dijalankan, blok __finally handler penghentian dijalankan karena alur kontrol telah meninggalkan blok __try dari handler 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 
    } 
}