Penanganan Pengecualian dalam OOP
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 81 dari 104.
Penanganan exception di C++ menyediakan cara terstruktur untuk mendeteksi dan menanggapi error saat runtime. Dalam pemrograman berorientasi object, exception terintegrasi secara alami dengan hierarki class, sehingga kamu dapat membuat tipe error yang bermakna dan memuat konteks tentang apa yang salah.
Mekanisme dasarnya menggunakan tiga kata kunci: try, throw, dan catch. Kode yang mungkin gagal ditempatkan dalam blok try, error ditandai dengan throw, dan blok catch menangani tipe exception tertentu:
#include <iostream>
#include <stdexcept>
class BankAccount {
double balance;
public:
BankAccount(double b) : balance(b) {}
void withdraw(double amount) {
if (amount > balance) {
throw std::runtime_error("Insufficient funds");
}
balance -= amount;
}
double getBalance() const { return balance; }
};
int main() {
BankAccount account(100.0);
try {
account.withdraw(150.0);
} catch (const std::runtime_error& e) {
std::cout << "Error: " << e.what() << "\n";
}
std::cout << "Balance: " << account.getBalance() << "\n";
}Standard library C++ menyediakan hierarki class exception yang berakar pada std::exception. Class turunan yang umum mencakup std::runtime_error untuk masalah saat program berjalan dan std::logic_error untuk kesalahan pemrograman. Semua exception standar menyediakan method what() yang mengembalikan pesan error.
Saat exception dilempar, stack akan dibongkar, dan destructor dipanggil untuk semua object lokal saat program mencari blok catch yang cocok. Ini memastikan pembersihan yang tepat, bahkan saat error terjadi, sehingga RAII dan penanganan exception bekerja sangat baik bersama.
Tantangan
MudahMari kita buat kalkulator pembagian yang aman untuk menunjukkan penanganan exception dalam konteks berorientasi objek. Kamu akan membuat class Calculator yang melakukan operasi pembagian dan melempar exception yang bermakna saat terjadi masalah, lalu menangani exception tersebut dengan baik di program utamamu.
Kamu akan mengatur kodemu dalam tiga file:
Calculator.h: Definisikan classCalculatoryang melakukan operasi matematika dengan penanganan error yang tepat.Calculatormilikmu harus memiliki methoddivide(double numerator, double denominator)yang mengembalikan hasil pembagian. Namun, jika denominator bernilai nol, method tersebut harus melemparstd::runtime_errordengan pesanDivision by zero. Jika numerator atau denominator bernilai negatif, method tersebut harus melemparstd::invalid_argumentdengan pesanNegative values not allowed.Sertakan juga method
safeSqrt(double value)yang mengembalikan akar kuadrat dari nilai tersebut. Jika nilainya negatif, lemparstd::runtime_errordengan pesanCannot compute square root of negative number. Kamu perlu menyertakan<cmath>untuk fungsisqrt.Calculator.cpp: Implementasikan method yang dideklarasikan di file header-mu. Pastikan untuk menyertakan header yang diperlukan (<stdexcept>dan<cmath>) serta memeriksa kondisi sebelum melakukan operasi.main.cpp: Baca tiga input, masing-masing pada baris terpisah:- Jenis operasi:
divideatausqrt - Angka pertama (double)
- Angka kedua (double): hanya digunakan untuk pembagian, diabaikan untuk sqrt
Buat object
Calculatordan lakukan operasi yang diminta di dalam blok try. Jika operasi berhasil, cetakResult: [value]. Jika exception tertangkap, cetakError: [message], dengan message yang diambil dari methodwhat()milik exception.Setelah blok try-catch, terlepas dari apakah terjadi exception atau tidak, cetak
Calculation completeuntuk menunjukkan bahwa program terus berjalan setelah menangani exception.- Jenis operasi:
Sebagai contoh, dengan input divide, 10, dan 2:
Result: 5
Calculation completeDengan input divide, 10, dan 0:
Error: Division by zero
Calculation completeDengan input divide, -5, dan 2:
Error: Negative values not allowed
Calculation completeDengan input sqrt, 16, dan 0:
Result: 4
Calculation completeDengan input sqrt, -9, dan 0:
Error: Cannot compute square root of negative number
Calculation completePerhatikan bagaimana program menangani error dengan baik dengan menangkap exception dan menampilkan pesan yang bermakna, lalu melanjutkan eksekusi. Pola ini membuat penanganan error-mu tetap rapi dan logika utama program berfokus pada jalur normal.
Coba sendiri
#include <iostream>
#include <string>
#include "Calculator.h"
using namespace std;
int main() {
// Baca input
string operation;
double num1, num2;
cin >> operation;
cin >> num1;
cin >> num2;
// Buat object Calculator
Calculator calc;
// TODO: Gunakan blok try-catch untuk menjalankan operasi
// - Jika operation adalah "divide", panggil calc.divide(num1, num2)
// - Jika operation adalah "sqrt", panggil calc.safeSqrt(num1)
// - Jika berhasil, cetak "Result: " diikuti hasilnya
// - Tangkap exception dan cetak "Error: " diikuti pesan exception (gunakan what())
// - Setelah try-catch, selalu cetak "Calculation complete"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk11Konsep OOP Lanjutan
Komposisi vs PewarisanMixin melalui CRTPIdiom PimplPenghapusan TipeKelas Enum dan Pengetikan KuatPenanganan Pengecualian dalam OOPHierarki Pengecualian Kustom3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online