Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Calculator yang melakukan operasi matematika dengan penanganan error yang tepat.

    Calculator milikmu harus memiliki method divide(double numerator, double denominator) yang mengembalikan hasil pembagian. Namun, jika denominator bernilai nol, method tersebut harus melempar std::runtime_error dengan pesan Division by zero. Jika numerator atau denominator bernilai negatif, method tersebut harus melempar std::invalid_argument dengan pesan Negative values not allowed.

    Sertakan juga method safeSqrt(double value) yang mengembalikan akar kuadrat dari nilai tersebut. Jika nilainya negatif, lempar std::runtime_error dengan pesan Cannot compute square root of negative number. Kamu perlu menyertakan <cmath> untuk fungsi sqrt.

  • 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:
    1. Jenis operasi: divide atau sqrt
    2. Angka pertama (double)
    3. Angka kedua (double): hanya digunakan untuk pembagian, diabaikan untuk sqrt

    Buat object Calculator dan lakukan operasi yang diminta di dalam blok try. Jika operasi berhasil, cetak Result: [value]. Jika exception tertangkap, cetak Error: [message], dengan message yang diambil dari method what() milik exception.

    Setelah blok try-catch, terlepas dari apakah terjadi exception atau tidak, cetak Calculation complete untuk menunjukkan bahwa program terus berjalan setelah menangani exception.

Sebagai contoh, dengan input divide, 10, dan 2:

Result: 5
Calculation complete

Dengan input divide, 10, dan 0:

Error: Division by zero
Calculation complete

Dengan input divide, -5, dan 2:

Error: Negative values not allowed
Calculation complete

Dengan input sqrt, 16, dan 0:

Result: 4
Calculation complete

Dengan input sqrt, -9, dan 0:

Error: Cannot compute square root of negative number
Calculation complete

Perhatikan 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online