Bagikan melalui


Pengecualian: Mengonversi dari Makro Pengecualian MFC

Ini adalah topik lanjutan.

Artikel ini menjelaskan cara mengonversi kode yang ada yang ditulis dengan makro Kelas Microsoft Foundation — TRY, CATCH, THROW, dan sebagainya — untuk menggunakan kata kunci trypenanganan pengecualian C++ , , catchdan throw. Topik meliputi:

Keuntungan Mengonversi

Anda mungkin tidak perlu mengonversi kode yang ada, meskipun Anda harus mengetahui perbedaan antara implementasi makro di MFC versi 3.0 dan implementasi dalam versi sebelumnya. Perbedaan ini dan perubahan perilaku kode berikutnya dibahas dalam Pengecualian: Perubahan Makro Pengecualian di Versi 3.0.

Keuntungan utama dari konversi adalah:

  • Kode yang menggunakan kata kunci penanganan pengecualian C++ dikompilasi ke .EXE atau .DLL yang sedikit lebih kecil.

  • Kata kunci penanganan pengecualian C++ lebih serbaguna: Mereka dapat menangani pengecualian dari jenis data apa pun yang dapat disalin (int, , floatchar, dan sebagainya), sedangkan makro hanya menangani pengecualian kelas CException dan kelas yang berasal darinya.

Perbedaan utama antara makro dan kata kunci adalah bahwa kode menggunakan makro "secara otomatis" menghapus pengecualian yang ditangkap ketika pengecualian keluar dari cakupan. Kode yang menggunakan kata kunci tidak, jadi Anda harus secara eksplisit menghapus pengecualian yang tertangkap. Untuk informasi selengkapnya, lihat artikel Pengecualian: Menangkap dan Menghapus Pengecualian.

Perbedaan lain adalah sintaksis. Sintaks untuk makro dan kata kunci berbeda dalam tiga hal:

  1. Argumen makro dan deklarasi pengecualian:

    Pemanggilan makro CATCH memiliki sintaks berikut:

    CATCH(exception_class, exception_object_pointer_name)

    Perhatikan koma antara nama kelas dan nama penunjuk objek.

    Deklarasi pengecualian untuk catch kata kunci menggunakan sintaks ini:

    catch(exception_name exception_type)

    Pernyataan deklarasi pengecualian ini menunjukkan jenis pengecualian yang ditangani blok tangkapan.

  2. Pembatas blok tangkapan:

    Dengan makro, makro CATCH (dengan argumennya) memulai blok tangkapan pertama; makro AND_CATCH memulai blok tangkapan berikutnya, dan makro END_CATCH mengakhiri urutan blok tangkapan.

    Dengan kata kunci, catch kata kunci (dengan deklarasi pengecualiannya) memulai setiap blok tangkapan. Tidak ada rekanan dengan makro END_CATCH ; blok tangkapan berakhir dengan kurung kurawal penutupnya.

  3. Ekspresi lemparan:

    Makro menggunakan THROW_LAST untuk melempar ulang pengecualian saat ini. Kata throw kunci, tanpa argumen, memiliki efek yang sama.

Melakukan Konversi

Untuk mengonversi kode menggunakan makro untuk menggunakan kata kunci penanganan pengecualian C++

  1. Temukan semua kemunculan makro MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW, dan THROW_LAST.

  2. Ganti atau hapus semua kemunculan makro berikut:

    TRY (Ganti dengan try)

    CATCH (Ganti dengan catch)

    AND_CATCH (Ganti dengan catch)

    END_CATCH (Hapus)

    THROW (Ganti dengan throw)

    THROW_LAST (Ganti dengan throw)

  3. Ubah argumen makro sehingga membentuk deklarasi pengecualian yang valid.

    Misalnya, ubah

    CATCH(CException, e)
    

    ke

    catch (CException* e)
    
  4. Ubah kode dalam blok tangkapan sehingga menghapus objek pengecualian seperlunya. Untuk informasi selengkapnya, lihat artikel Pengecualian: Menangkap dan Menghapus Pengecualian.

Berikut adalah contoh kode penanganan pengecualian menggunakan makro pengecualian MFC. Perhatikan bahwa karena kode dalam contoh berikut menggunakan makro, pengecualian e dihapus secara otomatis:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

Kode dalam contoh berikutnya menggunakan kata kunci pengecualian C++, sehingga pengecualian harus dihapus secara eksplisit:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch (CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

Untuk informasi selengkapnya, lihat Pengecualian: Menggunakan Makro MFC dan Pengecualian C++.

Baca juga

Penanganan Pengecualian