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. Tümünü yakalayan işleyici catch(...), daha özel catch bloklarınız tarafından işlenmemiş tüm istisnaları yakalayan bir güvenlik ağı sağlar.
Genel yakalayıcı, belirli bir istisna türü belirtmek yerine üç nokta (...) kullanır. C++, bunları sırayla kontrol ettiğinden, diğer tüm catch bloklarından sonra yerleştirilmelidir:
try {
// Çeşitli istisnalar fırlatabilecek kod
} 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;
}Catch-all işleyicisi, önceki bloklar tarafından yakalanmayan tüm istisna türleri için bir geri dönüş mekanizması görevi görür. Bu, özellikle öngörmediğiniz istisnaları oluşturabilecek kodlarla çalışırken kullanışlıdır ve programınızın beklenmeyen hatalar nedeniyle çökmesini önler.
Bir catch-all bloğunda istisnanın belirli ayrıntılarına erişemeseniz de genel bir hata mesajı sağlayabilir ve programınızın sorunsuz çalışmasını sürdürmek için temizleme işlemleri gerçekleştirebilirsiniz.
Görev
KolayBir catch-all işleyicisi de dahil olmak üzere birden fazla catch bloğu kullanarak kapsamlı exception handling gösteren bir program oluştur. Bu challenge, hem belirli exception türlerini hem de önceden tanımlanmış kategorilere uymayan beklenmeyen hataları nasıl ele alacağını anlama düzeyini test edecektir.
Aşağıdaki girdiler sağlanacaktır:
- Gerçekleştirilecek testin türünü temsil eden bir string
testType("string_convert","math_operation","array_access"veya"unknown_error") - İşlem için birincil veri olarak kullanılacak bir string
value1 - Bazı işlemler için ikincil veri olarak kullanılacak bir string
value2
Programın şunları yapması gerekir:
- Üç string parametresi alan
performTestadlı bir function oluştur - Function içinde, farklı test türlerini ele almak için bir if-else yapısı kullan:
- testType
"string_convert"ise: value1 değerini bir tamsayıya dönüştürmek ve yazdırmak içinstd::stoikullan - testType
"math_operation"ise: hem value1 hem de value2 değerlerinistd::stoikullanarak tamsayılara dönüştür, ardından value1 değerini value2 değerine böl ve result değerini yazdır - testType
"array_access"ise:"Programming"adlı bir string oluştur, value1 değerinistd::stoikullanarak bir tamsayı index değerine dönüştür, ardından o index konumundaki karaktere erişmek ve yazdırmak içinstr.at(index)kullan..at()methodu, index invalid olduğunda otomatik olarakstd::out_of_rangefırlatır: manuel sınır kontrolü gerekmez - testType
"unknown_error"ise:999tamsayı değerini fırlat - main function içinde
performTestçağrısını birtrybloğunun içinde gerçekleştir - Exception'ları şu kesin sırayla ele almak için birden fazla
catchbloğu kullan: - Birinci: Geçersiz string-to-number dönüşümleri için
std::invalid_argument& - İkinci: too large sayılar veya sınırların dışındaki string index değerleri için
std::out_of_range& - Üçüncü: diğer tüm exception türleri için catch-all işleyicisi olarak
catch(...)
Aşağıdaki kesin çıktı biçimini kullan:
Başarılı işlemler için:
Success: [result_value]Farklı exception türleri için:
Invalid argument caught
Out of range caught
Unknown exception caughtcatch-all işleyicisinin en sona yerleştirilmesi gerektiğini unutma; çünkü C++ catch bloklarını sırayla kontrol eder. Bu işleyici, önceki özel catch blokları tarafından ele alınmayan tüm exception türlerini, "unknown_error" durumunda fırlatılan tamsayı exception'ı da dahil olmak üzere yakalar. Catch-all işleyicisi, bilinen exception türleri için özel işlem yapılmasına olanak tanırken beklenmeyen hatalara karşı bir güvenlik ağı sağlar.
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 EklemeKendi başına pratik yap: Online C++ derleyicisi