Bagikan melalui


Pengecualian: Menggunakan Makro MFC dan Pengecualian C++

Artikel ini membahas pertimbangan untuk menulis kode yang menggunakan makro penanganan pengecualian MFC dan kata kunci penanganan pengecualian C++.

Artikel ini membahas topik berikut ini:

Mencampur Kata Kunci dan Makro Pengecualian

Anda dapat mencampur makro pengecualian MFC dan kata kunci pengecualian C++ dalam program yang sama. Tetapi Anda tidak dapat mencampur makro MFC dengan kata kunci pengecualian C++ di blok yang sama karena makro menghapus objek pengecualian secara otomatis ketika keluar dari cakupan, sedangkan kode menggunakan kata kunci penanganan pengecualian tidak. Untuk informasi selengkapnya, lihat artikel Pengecualian: Menangkap dan Menghapus Pengecualian.

Perbedaan utama antara makro dan kata kunci adalah bahwa makro "secara otomatis" menghapus pengecualian yang ditangkap ketika pengecualian keluar dari cakupan. Kode yang menggunakan kata kunci tidak; pengecualian yang tertangkap dalam blok tangkapan harus dihapus secara eksplisit. Mencampur makro dan kata kunci pengecualian C++ dapat menyebabkan kebocoran memori ketika objek pengecualian tidak dihapus, atau kerusakan tumpukan saat pengecualian dihapus dua kali.

Kode berikut, misalnya, membatalkan penunjuk pengecualian:

TRY
{
   TRY
   {
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)  // The "inner" catch block
{
   throw;  // Invalid attempt to throw exception
         // to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
   // Pointer e is invalid because
   // it was deleted in the inner catch block.
}
END_CATCH

Masalah terjadi karena e dihapus ketika eksekusi melewati blok CATCH "dalam". Menggunakan makro THROW_LAST alih-alih pernyataan THROW akan menyebabkan blok CATCH "luar" menerima pointer yang valid:

TRY
{
   TRY
   {
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)  // The "inner" catch block
{
   THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
   // Pointer e is valid because
   // THROW_LAST() was used.
}
END_CATCH

Coba Blokir Di Dalam Blok Tangkap

Anda tidak dapat melemparkan kembali pengecualian saat ini dari dalam try blok yang berada di dalam blok CATCH . Contoh berikut tidak valid:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception 
            // being thrown) to be deleted.
   }
   catch (CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

Untuk informasi selengkapnya, lihat Pengecualian: Memeriksa Konten Pengecualian.

Baca juga

Penanganan Pengecualian