catch all
- C++ kursu
- Başlangıç
- Ders 104/116
- 5 dk
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
#include <iostream>
using namespace std;
int main() {
// try içinde bir hata fırlat, güvenlik ağı ile yakala
return 0;
}Örnek çözüm
#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
try {
riskyCode();
} ____ (...) {
cout << "Hata";
}
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.