Bagikan melalui


Pengecualian: Melemparkan Pengecualian dari Fungsi Anda Sendiri

Dimungkinkan untuk menggunakan paradigma penanganan pengecualian MFC semata-mata untuk menangkap pengecualian yang dilemparkan oleh fungsi di MFC atau pustaka lainnya. Selain menangkap pengecualian yang dilemparkan oleh kode pustaka, Anda dapat melemparkan pengecualian dari kode Anda sendiri jika Anda menulis fungsi yang dapat mengalami kondisi luar biasa.

Ketika pengecualian dilemparkan, eksekusi fungsi saat ini dihentikan dan melompat langsung ke catch blok bingkai pengecualian terdalam. Mekanisme pengecualian melewati jalur keluar normal dari fungsi. Oleh karena itu, Anda harus yakin untuk menghapus blok memori yang akan dihapus di pintu keluar normal.

Untuk melempar pengecualian

  1. Gunakan salah satu fungsi pembantu MFC, seperti AfxThrowMemoryException. Fungsi-fungsi ini melempar objek pengecualian yang telah dialokasikan sebelumnya dari jenis yang sesuai.

    Dalam contoh berikut, fungsi mencoba mengalokasikan dua blok memori dan melempar pengecualian jika salah satu alokasi gagal:

    {
    char* p1 = (char*)malloc(SIZE_FIRST);
    if (p1 == NULL)
    AfxThrowMemoryException();
    char* p2 = (char*)malloc(SIZE_SECOND);
    if (p2 == NULL)
    {
       free(p1);
       AfxThrowMemoryException();
    }
    
    // ... Do something with allocated blocks ...
    
    // In normal exit, both blocks are deleted.
    free(p1);
    free(p2);
    }
    

    Jika alokasi pertama gagal, Anda cukup melemparkan pengecualian memori. Jika alokasi pertama berhasil tetapi yang kedua gagal, Anda harus membebaskan blok alokasi pertama sebelum melemparkan pengecualian. Jika kedua alokasi berhasil, Anda dapat melanjutkan secara normal dan membebaskan blok saat keluar dari fungsi.

    • atau -
  2. Gunakan pengecualian yang ditentukan pengguna untuk menunjukkan kondisi masalah. Anda dapat melempar item dengan jenis apa pun, bahkan seluruh kelas, sebagai pengecualian Anda.

    Contoh berikut mencoba memutar suara melalui perangkat gelombang dan melemparkan pengecualian jika ada kegagalan.

    #define WAVE_ERROR -5
       {
       // This Win32 API returns 0 if the sound cannot be played.
       // Throw an integer constant if it fails.
       if (!PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC))
          throw WAVE_ERROR;
       }
    

Catatan

Penanganan default pengecualian MFC hanya berlaku untuk penunjuk ke CException objek (dan objek kelas turunan CException). Contoh di atas melewati mekanisme pengecualian MFC.

Baca juga

Penanganan Pengecualian