Genel Yakalayıcı
Coddy'nin C++ Journey'sinin Mantık & Akış bölümünün bir parçası — ders 52 / 56.
Bazen programınız, planladığınız belirli istisna türlerine uymayan beklenmedik hatalarla karşılaşabilir. Her şeyi yakalayan işleyici catch(...), daha spesifik catch bloklarınız tarafından işlenmeyen tüm istisnaları yakalayan bir güvenlik ağı sağlar.
Her şeyi yakalayan (catch-all) işleyici, belirli bir istisna türü belirtmek yerine üç nokta (...) kullanır. C++ bunları sırayla kontrol ettiği için, diğer tüm catch bloklarından sonra yerleştirilmelidir:
try {
// Code that might throw various exceptions
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}Genel yakalayıcı (catch-all handler), önceki bloklar tarafından yakalanmayan herhangi bir istisna türü için bir son çare görevi görür. Bu, özellikle öngörmediğiniz istisnalar fırlatabilecek kodlarla çalışırken kullanışlıdır ve programınızın beklenmedik hatalar nedeniyle çökmemesini sağlar.
Bir catch-all bloğunda istisnanın belirli ayrıntılarına erişemeseniz de, programınızın sorunsuz çalışmaya devam etmesini sağlamak için yine de genel bir hata mesajı sağlayabilir ve temizleme işlemleri gerçekleştirebilirsiniz.
Görev
KolayCatch-all işleyicisi de dahil olmak üzere birden fazla catch bloğu kullanarak kapsamlı istisna yönetimini gösteren bir program oluşturun. Bu zorluk, hem belirli istisna türlerini hem de önceden tanımlanmış kategorilere uymayan beklenmedik hataları nasıl yöneteceğinizi anlama yeteneğinizi test edecektir.
Aşağıdaki girdiler sağlanacaktır:
- Gerçekleştirilecek testin türünü temsil eden bir
testTypedizesi ("string_convert","math_operation","array_access"veya"unknown_error") - İşlem için birincil veri olarak kullanılacak bir
value1dizesi - Bazı işlemler için ikincil veri olarak kullanılacak bir
value2dizesi
Programınız şunları yapmalıdır:
- Üç dize parametresi alan
performTestadında bir fonksiyon oluşturun - Fonksiyonun içinde, farklı test türlerini işlemek için bir if-else yapısı kullanın:
- Eğer testType
"string_convert"ise: value1'i bir tam sayıya dönüştürmek içinstd::stoikullanın ve sonucu yazdırın - Eğer testType
"math_operation"ise: hem value1 hem de value2'yistd::stoikullanarak tam sayılara dönüştürün, ardından value1'i value2'ye bölün ve sonucu yazdırın - Eğer testType
"array_access"ise:"Programming"dizesini oluşturun, value1'istd::stoikullanarak bir tam sayı dizinine (index) dönüştürün, ardından o dizindeki karaktere erişmek içinstr.at(index)kullanın ve sonucu yazdırın..at()yöntemi, dizin geçersizse otomatik olarakstd::out_of_rangefırlatır — manuel sınır kontrolüne gerek yoktur - Eğer testType
"unknown_error"ise:999tam sayı değerini fırlatın (throw) - Ana fonksiyonda (main function),
performTestfonksiyonunu birtrybloğu içinde çağırın - İstisnaları tam olarak şu sırayla işlemek için birden fazla
catchbloğu kullanın: - Birinci: Geçersiz dizeden sayıya dönüştürmeler için
std::invalid_argument& - İkinci: Çok büyük sayılar veya dize dizini sınır dışı durumları için
std::out_of_range& - Üçüncü: Diğer tüm istisna türleri için catch-all işleyicisi olarak
catch(...)
Aşağıdaki tam çıktı formatını kullanın:
Başarılı işlemler için:
Success: [result_value]Farklı istisna türleri için:
Invalid argument caught
Out of range caught
Unknown exception caughtC++ catch bloklarını sırayla kontrol ettiği için catch-all işleyicisi olan catch(...) bloğunun en sona yerleştirilmesi gerektiğini unutmayın. Bu işleyici, "unknown_error" durumunda fırlatılan tam sayı istisnası da dahil olmak üzere, önceki belirli catch blokları tarafından işlenmeyen her türlü istisna türünü yakalayacaktır. Catch-all işleyicisi, bilinen istisna türleri için özel işleme izin verirken beklenmedik hatalar için bir güvenlik ağı sağlar.
Kopya kağıdı
Genel yakalayıcı (catch-all handler) catch(...), belirli catch blokları tarafından işlenmeyen tüm istisnaları yakalayan bir güvenlik ağı sağlar.
Genel yakalayıcı üç nokta (...) kullanır ve C++ bunları sırayla kontrol ettiği için diğer tüm catch bloklarından sonra yerleştirilmelidir:
try {
// Code that might throw various exceptions
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}Genel yakalayıcı, önceki bloklar tarafından yakalanmayan herhangi bir istisna türü için bir yedek plan görevi görür. Genel bir yakalama bloğunda belirli istisna ayrıntılarına erişemeseniz de, genel hata mesajları sağlayabilir ve temizleme işlemleri gerçekleştirebilirsiniz.
Kendin dene
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Kodunuzu buraya yazın - performTest fonksiyonunu oluşturun
int main() {
// Girdiyi oku
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Kodunuzu aşağıya yazın - try-catch bloklarını uygulayın ve performTest'i çağırın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İşaretçiler ve Bellek
İşaretçi Nedir?Adres OperatörüDereference OperatörüNull İşaretçilerİşaretçiler ve Diziler'new' ile Dinamik Bellek'delete' ile Belleği Serbest BırakmaÖzet - İşaretçi Pratiği2Vektörler (Dinamik Diziler)
std::vector'a GirişBir Vektör OluşturmaEleman EklemeElemanlara ErişmeVektör BoyutuFor Döngüsü ile YinelemeAralık Tabanlı For DöngüsüEleman SilmeÖzet - Vektör İşlemleri5Proje: Envanter Aracı
Proje KurulumuÖğe Ekleme ve Güncelleme8Temel Hata Yönetimi
İstisnalara Giriş'try' ve 'catch' Blokları'throw' Anahtar KelimesiFarklı İstisna TürleriGenel YakalayıcıÖzet - Güvenli Bölme3Proje: Görev Listesi Aracı
Projeye Genel BakışGörev Ekleme