CodeBlanks Logo Icon CodeBlanks

catch all

catch(...) ile tüm istisnaları yakalamayı öğrenirsin.

catch(...) ile hepsini yakala

Bazen istisnanın türünü önceden bilemezsin; yine de programın çökmesini engellemek istersin. Böyle durumlarda catch(...) biçimini kullanırsın. Üç nokta, her türden istisnayı yakalar.

try {
    riskyCode();
} catch (...) {
    cout << "Bilinmeyen hata";
}

Burada catch(...) hangi tür istisna fırlatılırsa fırlatılsın çalışır. Ancak istisnanın içeriğine erişemezsin; bu yüzden e.what() gibi metotlar kullanılamaz. catch(...) genellikle son çare olarak son catch bloğunda yer alır.

catch(...) sınırlamaları

catch(...) kullanışlıdır, ancak sınırlamaları vardır. En önemli sınırlama, istisnanın içeriğine erişim olmamasıdır; yani e.what() gibi metotlar kullanılamaz. Ayrıca hangi türün fırlatıldığı bilgisi kaybolur.

Bu yüzden catch(...)'i en son blok olarak kullanmak yaygın bir uygulamadır. Önce belirli türleri yakalayan catch blokları yazılır, en sonda catch(...) ile hiçbiriyle eşleşmeyen istisnalar toplanır. Bu düzen, bilinen hatalara özel yanıt verirken bilinmeyenlerin de çökmeyi önler.

Uygulama catch(...) ile güvenlik ağı kur

try bloğu içinde throw 42; yaz (tamsayı fırlat). catch (...) bloğu içinde cout << "Bilinmeyen hata" << endl; yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
using namespace std;

int main() {
    // try içinde bir hata fırlat, güvenlik ağı ile yakala
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
using namespace std;

int main() {
    try {
        throw 42;
    } catch (...) {
        cout << "Bilinmeyen hata" << endl;
    }
    return 0;
}

Beklenen çıktı

Bilinmeyen hata

Soru ve cevaplar

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

1 Boşluğu doldur: catch all

Soru
try {
    riskyCode();
} ____ (...) {
    cout << "Hata";
}
Cevap
try {
    riskyCode();
} catch (...) {
    cout << "Hata";
}

Açıklama: catch(...) her türü yakalar.

2 Bloğu özelliğiyle eşleştir

Kavram Anlamı
catch (std::exception&) tür bilgisi verir
catch (...) tüm türleri yakalar
try riskli kodu çevreler

3 catch(...) bloğunda e.what() çağrılabilir mi?

  • Hayır, istisna nesnesi yok Doğru cevap
  • Evet, her zaman
  • Yalnızca throw sonrası
  • Sadece const ile

Açıklama: catch(...)'te istisna nesnesi adı yoktur; e.what() çağrılamaz.

Başlangıç bölümündeki tüm dersler