Exception hierarchy
- C++ kursu
- İleri seviye
- Ders 73/83
- 5 dk
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
#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
#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
class InvalidScore : public ____ { };
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 |