Manajemen Eksepsi C++
Halo semua yang memiliki ambisi menjadi programmer! Hari ini, kita akan melakukan perjalanan yang menarik ke dalam dunia Manajemen Eksepsi C++. Sebagai guru ilmu komputer yang ramah di lingkungan kita, saya di sini untuk membimbing Anda melalui topik ini yang penting. Jadi, ambil minuman kesukaan Anda, bersantailah dan mari kita melompat masuk!
Apa Itu Eksepsi?
Sebelum kita memulai untuk melempar dan menangkap eksepsi seperti penjuggler berpengalaman, mari kita mengerti apa itu eksepsi. Dalam dunia pemrograman, eksepsi adalah peristiwa yang tidak diharapkan yang terjadi selama eksekusi suatu program. Itu seperti ujian pop yang saya sering memberikan (maaf tentang itu!) – tak terduga dan kadang-kadang agak sulit untuk ditangani.
Eksepsi mengganggu aliran normal dari instruksi program. Eksepsi dapat disebabkan oleh berbagai faktor, seperti:
- Pembagian dengan nol
- Mengakses array di luar batas
- Kehabisan memori
- Mencoba membuka file yang tidak ada
Sekarang, mari kita lihat bagaimana C++ memungkinkan kita untuk mengelola situasi tak terduga ini dengan grace.
Menglempar Eksepsi
Dasar-dasar Menglempar
Dalam C++, kita menggunakan kata kunci throw
untuk menaikkan eksepsi. Itu seperti menaikkan tangan Anda di kelas saat Anda memiliki pertanyaan atau masalah. Ini adalah contoh sederhana:
#include <iostream>
using namespace std;
int main() {
try {
throw 20;
}
catch (int e) {
cout << "Terjadi eksepsi. Nomor Eksepsi " << e << endl;
}
return 0;
}
Dalam contoh ini, kita melempar eksepsi integer dengan nilai 20. Tetapi jangan khawatir, kita akan menangkapnya segera!
Menglempar Tipe Berbeda
C++ sangat fleksibel dan memungkinkan Anda untuk melempar eksepsi berbagai tipe. Mari lihat contoh yang lebih praktis:
#include <iostream>
#include <stdexcept>
using namespace std;
double bagi(int a, int b) {
if (b == 0) {
throw runtime_error("Pembagian dengan nol!");
}
return static_cast<double>(a) / b;
}
int main() {
try {
cout << bagi(10, 2) << endl; // Ini akan bekerja baik
cout << bagi(10, 0) << endl; // Ini akan melempar eksepsi
}
catch (const runtime_error& e) {
cout << "Eksepsi ditangkap: " << e.what() << endl;
}
return 0;
}
Dalam contoh ini, kita melempar eksepsi runtime_error
saat seseorang mencoba untuk membagi dengan nol. Itu seperti menaruh tanda "Tidak Dapat Membagi Dengan Nol" di lingkungan matematika kita!
Menangkap Eksepsi
Dasar-dasar Menangkap
Sekarang bahwa kita tahu cara untuk melempar eksepsi, mari kita pelajari cara menangkapnya. Menangkap eksepsi adalah seperti menjadi pemilik hewan peliharaan yang bertanggung jawab – Anda harus siap untuk menangani apa pun yang kode Anda lemparkan!
Kita menggunakan blok try-catch
untuk menangkap eksepsi. Blok try
berisi kode yang mungkin melempar eksepsi, dan blok catch
menangani eksepsi jika itu terjadi.
#include <iostream>
using namespace std;
int main() {
try {
int umur = -5;
if (umur < 0) {
throw "Umur tidak bisa negatif!";
}
cout << "Umur adalah: " << umur << endl;
}
catch (const char* msg) {
cerr << "Error: " << msg << endl;
}
return 0;
}
Dalam contoh ini, kita memeriksa jika umur negatif. Jika ya, kita melempar eksepsi dengan pesan error khusus.
Menangkap Banyak Eksepsi
Terkadang, tipe eksepsi yang berbeda dapat dilempar dari potongan kode yang sama. Dalam kasus seperti ini, kita dapat memiliki banyak blok catch:
#include <iostream>
#include <stdexcept>
using namespace std;
int main() {
try {
int pilihan;
cout << "Masukkan 1 untuk eksepsi integer, 2 untuk runtime error: ";
cin >> pilihan;
if (pilihan == 1) {
throw 42;
} else if (pilihan == 2) {
throw runtime_error("Eksepsi runtime liar muncul!");
} else {
throw "Pilihan tidak diketahui!";
}
}
catch (int e) {
cout << "Eksepsi integer ditangkap: " << e << endl;
}
catch (const runtime_error& e) {
cout << "Eksepsi runtime ditangkap: " << e.what() << endl;
}
catch (...) {
cout << "Eksepsi yang tidak diketahui ditangkap!" << endl;
}
return 0;
}
Contoh ini menunjukkan cara kita menangkap eksepsi berbeda jenis. Blok catch (...)
adalah blok penangkap semua yang akan menangani eksepsi yang tidak ditangkap oleh blok catch sebelumnya. Itu seperti memiliki rakit penyelam untuk semua kejadian yang tak terduga!
Eksepsi Standar C++
C++ datang dengan sekumpulan eksepsi standar yang dapat Anda gunakan dalam program Anda. Ini adalah seperti piringan keris Swiss dari dunia eksepsi – serbaguna dan selalu siap membantu!
Berikut adalah tabel beberapa eksepsi standar yang umum digunakan:
Eksepsi | Deskripsi |
---|---|
std::runtime_error | Kesalahan logika runtime |
std::logic_error | Kesalahan logika |
std::out_of_range | Mengakses di luar jangkauan |
std::overflow_error | Kesalahan aritmetika yang melampaui kapasitas |
std::bad_alloc | Gagal alokasi memori |
Mari lihat contoh menggunakan eksepsi 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 melempar eksepsi out_of_range
}
catch (const out_of_range& e) {
cerr << "Kesalahan Out of Range: " << e.what() << endl;
}
return 0;
}
Dalam contoh ini, kita mencoba mengakses elemen yang di luar jangkauan di dalam vektor kita. Fungsi at()
melempar eksepsi out_of_range
saat ini terjadi.
Definisi Eksepsi Baru
Meskipun eksepsi standar sangat baik, terkadang Anda butuh sesuatu yang lebih teruai untuk kebutuhan spesifik Anda. Itu saat eksepsi khusus menjadi berguna!
Berikut ini cara Anda dapat mendefinisikan kelas eksepsi 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 akarKuadrat(double x) {
if (x < 0) {
throw NegativeValueException();
}
return sqrt(x);
}
int main() {
try {
cout << akarKuadrat(25) << endl; // Ini akan bekerja baik
cout << akarKuadrat(-5) << endl; // Ini akan melempar eksepsi kita
}
catch (const NegativeValueException& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}
Dalam contoh ini, kita telah membuat kelas eksepsi khusus NegativeValueException
. Kita menggunakan itu di fungsi akarKuadrat
untuk melempar eksepsi saat seseorang mencoba untuk menghitung akar kuadrat dari angka negatif.
Dan itu untuk saat ini, folks! Kita telah membahas dasar-dasar Manajemen Eksepsi C++. Ingat, eksepsi adalah teman Anda. Mereka membantu Anda menulis kode yang lebih robust dan tahan terhadap kesalahan. Terus练习, dan segera Anda akan menangani eksepsi seperti seorang pro!
Selamat coding, dan semoga eksepsi Anda selalu ditangkap!
Credits: Image by storyset