Penanganan pengecualian C++

Hai di sana, pemrogram yang berhasrat! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia Penanganan Pengecualian C++. Sebagai guru sains komputer yang ramah di lingkungan kita, saya di sini untuk membimbing anda melalui topik ini yang penting. Jadi, ambil minuman kesukaan anda, Duduk santai, dan mari kita melompat masuk!

C++ Exception Handling

Apa itu Pengecualian?

Sebelum kita mulai untuk melempar dan mencangkap pengecualian seperti pemain gasing yang berpengalaman, mari kita faham apa itu pengecualian. Dalam dunia pemrograman, pengecualian adalah peristiwa yang tidak diharapkan yang terjadi semasa eksekusi suatu program. Mereka seperti ujian pop yang saya pernah berikan (maaf tentang itu!) – tidak diharapkan dan kadang-kadang agak sulit untuk ditangani.

Pengecualian mengganggu aliran normal dari instruksi program. Mereka dapat disebabkan oleh beberapa faktor, seperti:

  1. Pembagian oleh nol
  2. Mengakses array di luar batas
  3. Kehabisan memori
  4. Mencoba membuka fail yang tidak ada

Sekarang, mari kita lihat bagaimana C++ membenarkan kita untuk mengurus situasi yang tidak diharapkan ini dengan grace.

Menghantar Pengecualian

Dasar-dasar Menghantar

Dalam C++, kita menggunakan kata kunci throw untuk menaikkan pengecualian. Ini seperti menaikkan tangan anda di atas kelas ketika anda memiliki pertanyaan atau masalah. Ini adalah contoh sederhana:

#include <iostream>
using namespace std;

int main() {
try {
throw 20;
}
catch (int e) {
cout << "Pengecualian terjadi. Nomor Pengecualian " << e << endl;
}
return 0;
}

Dalam contoh ini, kita menghantar pengecualian integer dengan nilai 20. Tapi jangan khawatir, kita akan mencangkapnya sebentar lagi!

Menghantar Jenis Berbeza

C++ adalah fleksibel dan membenarkan anda untuk menghantar pengecualian jenis berbeza. Mari lihat contoh yang lebih praktikal:

#include <iostream>
#include <stdexcept>
using namespace std;

double divide(int a, int b) {
if (b == 0) {
throw runtime_error("Pembagian oleh nol!");
}
return static_cast<double>(a) / b;
}

int main() {
try {
cout << divide(10, 2) << endl;  // Ini akan berfungsi baik
cout << divide(10, 0) << endl;  // Ini akan menghantar pengecualian
}
catch (const runtime_error& e) {
cout << "Pengecualian ditangkap: " << e.what() << endl;
}
return 0;
}

Dalam contoh ini, kita menghantar pengecualian runtime_error ketika seseorang mencoba untuk membagi oleh nol. Ini seperti meletakkan tanda "Tidak ada Pembagian oleh Nol" di atas lingkungan matematika kita!

Mencangkap Pengecualian

Dasar-dasar Mencangkap

Sekarang bahwa kita tahu bagaimana untuk menghantar pengecualian, mari kita belajar bagaimana untuk mencangkapnya. Mencangkap pengecualian adalah seperti menjadi pemilik hewan peliharaan yang bertanggungjawab – anda perlu untuk bersedia mengurus apa pun yang kode anda lempar ke atas anda!

Kita menggunakan blok try-catch untuk mencangkap pengecualian. Blok try berisi kode yang mungkin menghantar pengecualian, dan blok catch menangani pengecualian jika itu terjadi.

#include <iostream>
using namespace std;

int main() {
try {
int age = -5;
if (age < 0) {
throw "Umur tidak boleh negatif!";
}
cout << "Umur adalah: " << age << endl;
}
catch (const char* msg) {
cerr << "Error: " << msg << endl;
}
return 0;
}

Dalam contoh ini, kita memeriksa jika umur adalah negatif. Jika ya, kita menghantar pengecualian dengan pesan error khusus.

Mencangkap Pengecualian Berberapa

Kadang-kadang, jenis berbeza pengecualian dapat dihantar dari potongan kode yang sama. Dalam kasus seperti itu, kita dapat memiliki beberapa blok catch:

#include <iostream>
#include <stdexcept>
using namespace std;

int main() {
try {
int choice;
cout << "Masukkan 1 untuk pengecualian integer, 2 untuk runtime error: ";
cin >> choice;

if (choice == 1) {
throw 42;
} else if (choice == 2) {
throw runtime_error("Sebuah runtime error liar muncul!");
} else {
throw "Pilihan tak dikenal!";
}
}
catch (int e) {
cout << "Pengecualian integer ditangkap: " << e << endl;
}
catch (const runtime_error& e) {
cout << "Runtime error ditangkap: " << e.what() << endl;
}
catch (...) {
cout << "Pengecualian tak dikenal ditangkap!" << endl;
}
return 0;
}

Contoh ini menunjukkan bagaimana kita dapat mencangkap pengecualian jenis berbeza. Blok catch (...) adalah blok penangkap semua yang akan menangani setiap pengecualian yang tidak ditangkap oleh blok catch sebelumnya. Ini seperti memiliki rakitan penyelamat untuk semua yang tidak diharapkan!

Pengecualian Standar C++

C++ datang dengan satu set pengecualian standar yang anda dapat gunakan dalam program anda. Ini adalah seperti pisaunya Swiss Army dari dunia pengecualian – serbaguna dan selalu siap untuk membantu!

Berikut adalah tabel beberapa pengecualian standar yang biasa digunakan:

Pengecualian Keterangan
std::runtime_error Kesalahan logika runtime
std::logic_error Kesalahan logika
std::out_of_range Mengakses di luar jangkauan
std::overflow_error Kebanyakan aritmatika
std::bad_alloc Gagal alokasi memori

Mari lihat contoh menggunakan pengecualian standar:

#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;

int main() {
vector<int> numbers = {1, 2, 3, 4, 5};
try {
cout << numbers.at(10) << endl;  // Ini akan menghantar pengecualian out_of_range
}
catch (const out_of_range& e) {
cerr << "Out of Range error: " << e.what() << endl;
}
return 0;
}

Dalam contoh ini, kita mencoba untuk mengakses elemen yang di luar jangkauan di dalam vektor kita. Fungsi at() akan menghantar pengecualian out_of_range saat ini terjadi.

Definisi Pengecualian Baru

Meskipun pengecualian standar itu bagus, kadang-kadang anda butuh sesuatu yang lebih terkhusus untuk kebutuhan anda. Itu tempat pengecualian khusus datang ke tempatnya!

Berikut ini bagaimana anda dapat definisikan kelas pengecualian anda sendiri:

#include <iostream>
#include <exception>
using namespace std;

class NegativeValueException : public exception {
public:
const char* what() const throw() {
return "Nilai negatif tidak diizinkan!";
}
};

double squareRoot(double x) {
if (x < 0) {
throw NegativeValueException();
}
return sqrt(x);
}

int main() {
try {
cout << squareRoot(25) << endl;  // Ini akan berfungsi baik
cout << squareRoot(-5) << endl;  // Ini akan menghantar pengecualian kita khusus
}
catch (const NegativeValueException& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}

Dalam contoh ini, kita telah menciptakan kelas NegativeValueException khusus. Kita gunakan itu di dalam fungsi squareRoot kita untuk menghantar pengecualian ketika seseorang mencoba untuk menghitung akar kuadrat dari angka negatif.

Dan itu semua, folks! Kita telah menutupi dasar-dasar Penanganan Pengecualian C++. Ingat, pengecualian adalah teman anda. Mereka membantu anda menulis kode yang lebih robust dan kebal terhadap kesalahan. Teruskan untuk berlatih, dan segera anda akan menangani pengecualian seperti pro!

Selamat coding, dan semoga pengecualian anda selalu ditangkap!

Credits: Image by storyset