Menguasai Penanganan Pengecualian C++: Panduan Lengkap
Sebuah pengecualian adalah masalah yang timbul selama eksekusi program. Sebuah pengecualian C++ adalah respons terhadap keadaan ekstraordiner yang timbul saat program berjalan, seperti upaya pembagian dengan nol.
Pengecualian menyediakan cara untuk mentransfer kontrol dari satu bagian program ke bagian lain. Penanganan pengecualian C++ dibangun atas tiga kata kunci: try, catch, dan throw.
throw minus– Program melempar pengecualian ketika masalah muncul. Ini dilakukan menggunakan kata kunci throw.
catch minus– Program menangkap pengecualian dengan penangan pengecualian di tempat dalam program di mana Anda ingin menangani masalah. Kata kunci catch menunjukkan penangkapan pengecualian.
try minus– Blok try mengidentifikasi blok kode untuk pengecualian tertentu akan diaktifkan. Diikuti oleh satu atau lebih blok catch.
Asumsikan sebuah blok akan menghasilkan pengecualian, sebuah metode menangkap pengecualian menggunakan kombinasi kata kunci try dan catch. Blok try/catch ditempatkan di sekitar kode yang mungkin menghasilkan pengecualian. Kode dalam blok try/cash disebut sebagai kode terlindungi, dan sintaks untuk menggunakan try/catch sebagai berikut minus–
try { // kode terlindungi } catch( ExceptionName e1 ) { // blok catch } catch( ExceptionName e2 ) { // blok catch } catch( ExceptionName eN ) { // blok catch }
Anda dapat mencantumkan beberapa pernyataan catch untuk menangkap berbagai tipe pengecualian jika blok try Anda menghasilkan lebih dari satu pengecualian dalam situasi yang berbeda.
Melempar Pengecualian
Pengecualian dapat dilemparkan di mana saja dalam blok kode menggunakan pernyataan throw. Operand dari pernyataan throw menentukan tipe untuk pengecualian dan dapat berupa ekspresi apa pun dan tipe hasil dari ekspresi menentukan tipe pengecualian yang dilemparkan.
Berikut adalah contoh melempar pengecualian saat kondisi pembagian dengan nol terjadi minus–
double division(int a, int b) { if( b == 0 ) { throw "Kondisi pembagian dengan nol!"; } return (a/b); }
Menangkap Pengecualian
Blok catch setelah blok try menangkap pengecualian apa pun. Anda dapat menentukan tipe pengecualian apa yang ingin Anda tangkap dan ini ditentukan oleh deklarasi pengecualian yang muncul dalam kurung setelah kata kunci catch.
try { // kode terlindungi } catch( ExceptionName e ) { // kode untuk menangani pengecualian ExceptionName }
Kode di atas akan menangkap pengecualian tipe ExceptionName. Jika Anda ingin menentukan bahwa blok catch harus menangani tipe pengecualian apa pun yang dilemparkan dalam blok try, Anda harus menempatkan ellipsis, ..., di antara kurung yang mengapit deklarasi pengecualian sebagai berikut minus–
try { // kode terlindungi } catch(...) { // kode untuk menangani pengecualian apa pun }
Berikut adalah contoh, yang melempar pengecualian pembagian dengan nol dan kita tangkap dalam blok catch.
Live Demo
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Kondisi pembagian dengan nol!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; } catch (const char* msg) { cerr << msg << endl; } return 0; }
Karena kita melempar pengecualian tipe const char*, jadi saat menangkap pengecualian ini, kita harus menggunakan const char* dalam blok catch. Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Kondisi pembagian dengan nol!
Pengecualian Standar C++
C++ menyediakan daftar pengecualian standar yang didefinisikan dalam <exception> yang dapat kita gunakan dalam program kita. Ini diatur dalam hierarki kelas parent-child yang ditunjukkan di bawah minus–
Berikut adalah deskripsi kecil dari setiap pengecualian yang disebutkan dalam hierarki di atas minus–
| No.Urut | Pengecualian & Deskripsi |
| 1 | std::exception Sebuah pengecualian dan kelas induk dari semua pengecualian standar C++. |
| 2 | std::bad_alloc Ini dapat dilemparkan oleh new. |
| 3 | std::bad_cast Ini dapat dilemparkan oleh dynamic_cast. |
| 4 | std::bad_exception Ini adalah perangkat yang berguna untuk menangani pengecualian yang tidak terduga dalam program C++. |
| 5 | std::bad_typeid Ini dapat dilemparkan oleh typeid. |
| 6 | std::logic_error Sebuah pengecualian yang secara teoritis dapat terdeteksi dengan membaca kode. |
| 7 | std::domain_error Ini adalah pengecualian yang dilemparkan saat domain matematis yang tidak valid digunakan. |
| 8 | std::invalid_argument Ini dilemparkan karena argumen yang tidak valid. |
| 9 | std::length_error Ini dilemparkan saat std::string yang terlalu besar dibuat. |
| 10 | std::out_of_range Ini dapat dilemparkan oleh metode 'at', misalnya std::vector dan std::bitset<>::operator[](). |
| 11 | std::runtime_error Sebuah pengecualian yang secara teoritis tidak dapat terdeteksi dengan membaca kode. |
| 12 | std::overflow_error Ini dilemparkan jika overflow matematis terjadi. |
| 13 | std::range_error Ini terjadi saat Anda mencoba menyimpan nilai yang di luar rentang. |
| 14 | std::underflow_error Ini dilemparkan jika underflow matematis terjadi. |
Mendefinisikan Pengecualian Baru
Anda dapat mendefinisikan pengecualian Anda sendiri dengan mewarisi dan mengganti fungsionalitas kelas exception. Berikut adalah contoh, yang menunjukkan bagaimana Anda dapat menggunakan kelas std::exception untuk mengimplementasikan pengecualian Anda sendiri dengan cara standar minus–
Live Demo
#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "Pengecualian C++"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException ditangkap" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //Kesalahan lain } }
Ini akan menghasilkan hasil berikut minus–
MyException ditangkap Pengecualian C++
Di sini, what() adalah metode publik yang disediakan oleh kelas exception dan telah dioverride oleh semua kelas pengecualian anak. Ini mengembalikan penyebab dari sebuah pengecualian.