Pernyataan try, throw, dan catch (C++)
Untuk menerapkan penanganan pengecualian di C++, Anda menggunakan try
ekspresi , 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 throw
memunculkan—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
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