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 try
penanganan pengecualian C++ , , catch
dan 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
, ,float
char
, dan sebagainya), sedangkan makro hanya menangani pengecualian kelasCException
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:
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.
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.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++
Temukan semua kemunculan makro MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW, dan THROW_LAST.
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
)Ubah argumen makro sehingga membentuk deklarasi pengecualian yang valid.
Misalnya, ubah
CATCH(CException, e)
ke
catch (CException* e)
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk