CodeBlanks Logo Icon CodeBlanks

Exception hierarchy

Exception hiyerarşisi ve özel istisnaları öğrenirsin.

Exception hiyerarşisi

C++'ta tüm istisnalar std::exception'dan türetilir. <stdexcept> başlığı iki ana dal sunar: std::logic_error (programcı hatası) ve std::runtime_error (çalışma zamanı koşulu).

std::logic_error'dan türeyenler: std::invalid_argument, std::out_of_range, std::length_error. std::runtime_error'dan türeyenler: std::overflow_error, std::underflow_error, std::system_error. Bu hiyerarşi sayesinde tek bir catch (const std::exception&) ile tüm istisnaları yakalayabilirsin. Her istisna what() üyesiyle bir ileti döndürür.

Özel istisna sınıfı

Kendi istisna sınıfını std::exception'dan türeterek yazarsın. what() üyesini override ile yeniden tanımlarsın.

Örnek: class InvalidScore : public std::exception { public: const char* what() const noexcept override { return "negatif skor"; } };. what() hem const hem noexcept olur; bu, üst sınıfla uyumluluk içindir. Böylece throw InvalidScore{}; ile fırlatıp catch (const std::exception& e) ile yakalayabilirsin. İleti, e.what() ile okunur.

Uygulama Özel istisna sınıfı yaz

InvalidScore sınıfını std::exception'dan türet. what() üyesi const noexcept override olsun ve "negatif skor" döndürsün. main içinde throw InvalidScore{} ile fırlat ve catch (const std::exception& e) ile yakalayıp e.what()'ı yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <exception>

// InvalidScore sınıfını std::exception'dan türet

int main() {
    // throw ile fırlat ve catch ile yakala
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <exception>

class InvalidScore : public std::exception {
public:
    const char* what() const noexcept override {
        return "negatif skor";
    }
};

int main() {
    try {
        throw InvalidScore{};
    } catch (const std::exception& e) {
        std::cout << e.what();
    }
    return 0;
}

Beklenen çıktı

negatif skor

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangisi std::logic_error'dan türetilmiştir?

  • std::out_of_range Doğru cevap
  • std::overflow_error
  • std::runtime_error
  • std::bad_alloc

Açıklama: std::out_of_range, std::logic_error'dan türetilmiş bir programcı hatasıdır.

2 std::exception türetme

Soru
class InvalidScore : public ____ { };
Cevap
class InvalidScore : public std::exception { };

Açıklama: Özel istisnalar std::exception'dan türetilir.

3 Sınıfı açıklamasıyla eşle

Kavram Anlamı
std::exception Temel sınıf
std::logic_error Programcı hatası
std::runtime_error Çalışma zamanı
std::out_of_range Sınır dışı erişim

İleri seviye bölümündeki tüm dersler