Bagikan melalui


Pernyataan try, throw, dan catch (C++)

Untuk menerapkan penanganan pengecualian di C++, Anda menggunakan tryekspresi , throw, dan catch .

Pertama, gunakan try blok untuk mengapit satu atau beberapa pernyataan yang mungkin melemparkan pengecualian.

Ekspresi throw menandakan bahwa kondisi luar biasa—sering kali, kesalahan—telah terjadi di try blok. Anda dapat menggunakan objek dari jenis apa pun sebagai operand throw ekspresi. Biasanya, objek ini digunakan untuk mengomunikasikan informasi tentang kesalahan. Dalam kebanyakan kasus, kami sarankan Anda menggunakan std::exception kelas atau salah satu kelas turunan yang ditentukan dalam pustaka standar. Jika salah satu dari mereka tidak sesuai, kami sarankan Anda mendapatkan kelas pengecualian Anda sendiri dari std::exception.

Untuk menangani pengecualian yang mungkin dilemparkan, terapkan satu atau beberapa catch blok segera setelah try blok. Setiap catch blok menentukan jenis pengecualian yang dapat ditanganinya.

Contoh ini menunjukkan try blok dan handler-nya. Asumsikan bahwa GetNetworkResource() memperoleh data melalui koneksi jaringan dan bahwa dua jenis pengecualian adalah kelas yang ditentukan pengguna yang berasal dari std::exception. Perhatikan bahwa pengecualian ditangkap oleh const referensi dalam catch pernyataan. Sebaiknya Anda melemparkan pengecualian berdasarkan nilai dan menangkapnya dengan referensi const.

Contoh

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

Keterangan

Kode setelah try klausul adalah bagian kode yang dijaga. Ekspresi throwmemunculkan—yaitu, memunculkan—pengecualian. Blok kode setelah catch klausul adalah handler pengecualian. Ini adalah handler yang menangkap pengecualian yang dilemparkan jika jenis dalam throw ekspresi dan catch kompatibel. Untuk daftar aturan yang mengatur pencocokan jenis dalam catch blok, lihat Bagaimana Blok Penangkapan Dievaluasi. catch Jika pernyataan menentukan elipsis (...) alih-alih jenis, catch blok menangani setiap jenis pengecualian. Saat Anda mengompilasi dengan /EHa opsi , ini dapat mencakup pengecualian terstruktur C dan pengecualian asinkron yang dihasilkan sistem atau yang dihasilkan aplikasi seperti perlindungan memori, pelanggaran divide-by-zero, dan floating-point. Karena catch blok diproses dalam program untuk menemukan jenis yang cocok, handler elipsis harus menjadi handler terakhir untuk blok terkait try . Gunakan catch(...) dengan hati-hati; jangan izinkan program untuk melanjutkan kecuali blok tangkapan tahu cara menangani pengecualian tertentu yang tertangkap. Biasanya, catch(...) blok digunakan untuk mencatat kesalahan dan melakukan pembersihan khusus sebelum eksekusi program dihentikan.

Ekspresi throw yang tidak memiliki operand menggulung ulang pengecualian yang saat ini sedang ditangani. Kami merekomendasikan formulir ini saat menumbuhkan kembali pengecualian, karena ini mempertahankan informasi jenis polimorfik pengecualian asli. Ekspresi seperti itu hanya boleh digunakan dalam catch handler atau dalam fungsi yang dipanggil dari catch handler. Objek pengecualian yang ditumbuhi kembali adalah objek pengecualian asli, bukan salinan.

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

Baca juga

Praktik terbaik C++ modern untuk pengecualian dan penanganan kesalahan
Kata kunci
Pengecualian C++ yang Tidak Tertangani
__uncaught_exception