Bagikan melalui


Mencampur pengecualian C (terstruktur) dan C++

Jika Anda ingin menulis kode portabel, penggunaan penanganan pengecualian terstruktur (SEH) dalam program C++ tidak disarankan. Namun, Terkadang Anda mungkin ingin mengkompilasi menggunakan /EHa dan mencampur pengecualian terstruktur dan kode sumber C++, dan memerlukan beberapa fasilitas untuk menangani kedua jenis pengecualian. Karena handler pengecualian terstruktur tidak memiliki konsep objek atau pengecualian yang diketik, penangan tidak dapat menangani pengecualian yang dilemparkan oleh kode C++. Namun, handler C++ catch dapat menangani pengecualian terstruktur. Sintaks penanganan pengecualian C++ (try, , ) catchtidak diterima oleh pengkompilasi C, tetapi sintaks penanganan pengecualian terstruktur (__try, __except, ) __finallydidukung oleh pengkompilasi throwC++.

Lihat _set_se_translator untuk informasi tentang cara menangani pengecualian terstruktur sebagai pengecualian C++.

Jika Anda mencampur pengecualian terstruktur dan C++, ketahui potensi masalah ini:

  • Pengecualian C++ dan pengecualian terstruktur tidak dapat dicampur dalam fungsi yang sama.

  • Penghentian handler (__finally blok) selalu dijalankan, bahkan selama melepas lelah setelah pengecualian dilemparkan.

  • Penanganan pengecualian C++ dapat menangkap dan mempertahankan semantik unwind di semua modul yang dikompilasi dengan /EH opsi kompilator, yang memungkinkan semantik unwind.

  • Mungkin ada beberapa situasi di mana fungsi destruktor tidak dipanggil untuk semua objek. Misalnya, pengecualian terstruktur dapat terjadi saat mencoba melakukan panggilan fungsi melalui penunjuk fungsi yang tidak diinisialisasi. Jika parameter fungsi adalah objek yang dibangun sebelum panggilan, destruktor objek tersebut tidak dipanggil selama stack unwind.

Langkah berikutnya

Baca juga

Praktik terbaik C++ modern untuk pengecualian dan penanganan kesalahan