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 catch(...) işleyicisi, daha özel catch bloklarınız tarafından işlenmeyen tüm istisnaları yakalayarak bir güvenlik ağı sağlar.
Genel yakalama işleyicisi, belirli bir özel durum türü belirtmek yerine üç nokta (...) kullanır. C++, blokları sırayla denetlediğinden bu işleyici 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;
}Genel yakalama işleyicisi, önceki bloklar tarafından yakalanmamış tüm istisna türleri için yedek olarak görev yapar. Bu, özellikle öngörmediğiniz istisnaları fırlatabilecek kodlarla çalışırken kullanışlıdır; programınızın beklenmedik hatalar nedeniyle çökmesini önler.
Genel yakalama bloğunda özel durumun belirli ayrıntılarına erişemeseniz de, programınızın sorunsuz çalışmasını sağlamak için yine de genel bir hata mesajı verebilir 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 işlemeyi gösteren bir program oluşturun. Bu görev, hem belirli istisna türlerini hem de önceden tanımlanmış kategorilere uymayan beklenmedik hataları nasıl ele alacağınızı anladığınızı sınayacaktır.
Aşağıdaki girdiler sağlanacaktır:
- Gerçekleştirilecek testin türünü belirten 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
performTestadlı bir işlev oluşturun - İşlevin içinde, farklı test türlerini ele almak için bir if-else yapısı kullanın:
- testType
"string_convert"ise: value1 değerini bir tam sayıya dönüştürmek ve yazdırmak içinstd::stoikullanın - testType
"math_operation"ise: hem value1 hem de value2 değerlerinistd::stoikullanarak tam sayılara dönüştürün, ardından value1 değerini value2 değerine bölün ve sonucu yazdırın - testType
"array_access"ise:"Programming"dizesini oluşturun,std::stoikullanarak value1 değerini bir tam sayı dizinine dönüştürün, ardından bu dizindeki karaktere erişmek ve yazdırmak içinstr.at(index)kullanın..at()yöntemi, dizin geçersizse otomatik olarakstd::out_of_rangefırlatır: elle sınır denetimi yapmanız gerekmez - testType
"unknown_error"ise:999tam sayı değerini fırlatın - Ana işlevde,
performTestişlevini birtrybloğunun içinde çağırın - İstisnaları aşağıdaki sırayla ele almak için birden fazla
catchbloğu kullanın: - İlk olarak: Geçersiz dizeden sayıya dönüştürme işlemleri için
std::invalid_argument& - İkinci olarak: Çok büyük sayılar veya sınırların dışındaki dize dizinleri için
std::out_of_range& - Üçüncü olarak: Diğer tüm istisna türlerini yakalamak için catch-all işleyicisi olarak
catch(...)
Aşağıdaki kesin çıktı biçimini 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 caughtCatch-all işleyicisi catch(...) en sona yerleştirilmelidir; çünkü C++, catch bloklarını sırayla denetler. Bu işleyici, önceki belirli catch blokları tarafından ele alınmamış tüm istisna türlerini, "unknown_error" durumunda fırlatılan tam sayı istisnası da dahil olmak üzere, yakalar. Catch-all işleyicisi, bilinen istisna türlerinin özel olarak ele alınmasına olanak tanırken beklenmedik 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 okuyun
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 fonksiyonunu ç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