Menu
Coddy logo textTech

OOP'de İstisna Yönetimi

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 81 / 104.

C++'ta istisna işleme, çalışma zamanı hatalarını algılamak ve bunlara yanıt vermek için yapılandırılmış bir yol sağlar. Nesne yönelimli programlamada istisnalar, sınıf hiyerarşileriyle doğal biçimde bütünleşerek neyin yanlış gittiği hakkında bağlam taşıyan anlamlı hata türleri oluşturmanıza olanak tanır.

Temel mekanizma üç anahtar sözcük kullanır: try, throw ve catch. Başarısız olabilecek kod bir try bloğuna yerleştirilir, hatalar throw ile bildirilir ve catch blokları belirli özel durum türlerini işler:

#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";
}

C++ standart kütüphanesi, kökü std::exception olan bir istisna sınıfları hiyerarşisi sağlar. Yaygın türetilmiş sınıflar arasında çalışma zamanı sorunları için std::runtime_error ve programlama hataları için std::logic_error bulunur. Tüm standart istisnalar, bir hata mesajı döndüren what() yöntemini sağlar.

Bir istisna fırlatıldığında, yığın geri sarılır - program eşleşen bir catch bloğu ararken tüm yerel nesneler için yıkıcılar çağrılır. Bu, hatalar meydana geldiğinde bile uygun temizliğin yapılmasını sağlar; RAII ile istisna işlemenin birlikte bu kadar iyi çalışmasının nedeni budur.

challenge icon

Görev

Kolay

Anı istisna işlemeyi nesne yönelimli bir bağlamda gösteren güvenli bir bölme hesaplayıcısı oluşturalım. Bölme işlemlerini gerçekleştiren ve bir şeyler ters gittiğinde anlamlı istisnalar fırlatan bir Calculator sınıfı oluşturacak, ardından ana programınızda bu istisnaları düzgün bir şekilde ele alacaksınız.

Kodunuzu üç dosyaya ayıracaksınız:

  • Calculator.h: Uygun hata işleme ile matematiksel işlemler gerçekleştiren Calculator sınıfınızı tanımlayın.

    Calculator sınıfınız, bölme işleminin sonucunu döndüren bir divide(double numerator, double denominator) metoduna sahip olmalıdır. Ancak payda sıfırsa, std::runtime_error mesajıyla bir Division by zero fırlatmalıdır. Pay veya paydadan herhangi biri negatifse, std::invalid_argument mesajıyla bir Negative values not allowed fırlatmalıdır.

    Ayrıca, değerin karekökünü döndüren bir safeSqrt(double value) metodu ekleyin. Değer negatifse, std::runtime_error mesajıyla bir Cannot compute square root of negative number fırlatın. <cmath> fonksiyonu için sqrt dosyasını eklemeniz gerekecek.

  • Calculator.cpp: Başlık dosyanızda bildirilen metotları uygulayın. Gerekli başlık dosyalarını (<stdexcept> ve <cmath>) eklediğinizden ve işlemleri gerçekleştirmeden önce koşulları kontrol ettiğinizden emin olun.
  • main.cpp: Üç girdi okuyun (her biri ayrı bir satırda):
    1. İşlem türü: divide veya sqrt
    2. İlk sayı (double)
    3. İkinci sayı (double): yalnızca bölme için kullanılır, sqrt için yok sayılır

    Bir Calculator nesnesi oluşturun ve istenen işlemi bir try bloğu içinde gerçekleştirin. İşlem başarılı olursa Result: [value] yazdırın. Bir istisna yakalanırsa, istisnanın Error: [message] metodundan gelen mesajı kullanarak what() yazdırın.

    Try-catch bloğundan sonra (bir istisna oluşup oluşmadığına bakılmaksızın), istisnalar ele alındıktan sonra programın çalışmaya devam ettiğini göstermek için Calculation complete yazdırın.

Örneğin, divide, 10 ve 2 girdileriyle:

Result: 5
Calculation complete

divide, 10 ve 0 girdileriyle:

Error: Division by zero
Calculation complete

divide, -5 ve 2 girdileriyle:

Error: Negative values not allowed
Calculation complete

sqrt, 16 ve 0 girdileriyle:

Result: 4
Calculation complete

sqrt, -9 ve 0 girdileriyle:

Error: Cannot compute square root of negative number
Calculation complete

Programın istisnaları yakalayıp anlamlı mesajlar görüntüleyerek hataları nasıl düzgün bir şekilde ele aldığına, ardından çalışmaya devam ettiğine dikkat edin. Bu yaklaşım, hata işlemenizi temiz tutar ve ana mantığınızı başarılı senaryoya odaklar.

Kendin dene

#include <iostream>
#include <string>
#include "Calculator.h"

using namespace std;

int main() {
    // Girdileri oku
    string operation;
    double num1, num2;
    
    cin >> operation;
    cin >> num1;
    cin >> num2;
    
    // Calculator nesnesi oluştur
    Calculator calc;
    
    // TODO: İşlemi gerçekleştirmek için bir try-catch bloğu kullan
    // - Eğer operation "divide" ise, calc.divide(num1, num2) çağır
    // - Eğer operation "sqrt" ise, calc.safeSqrt(num1) çağır
    // - Başarı durumunda, "Result: " ardından sonucu yazdır
    // - İstisnaları yakala ve "Error: " ardından istisna mesajını yazdır (what() kullan)
    // - After the try-catch, always print "Calculation complete"
    
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi