Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Catch-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 testType dizesi ("string_convert", "math_operation", "array_access" veya "unknown_error")
  • İşlem için birincil veri olarak kullanılacak bir value1 dizesi
  • Bazı işlemler için ikincil veri olarak kullanılacak bir value2 dizesi

Programınız şunları yapmalıdır:

  1. Üç dize parametresi alan performTest adlı bir işlev oluşturun
  2. İşlevin içinde, farklı test türlerini ele almak için bir if-else yapısı kullanın:
  3. testType "string_convert" ise: value1 değerini bir tam sayıya dönüştürmek ve yazdırmak için std::stoi kullanın
  4. testType "math_operation" ise: hem value1 hem de value2 değerlerini std::stoi kullanarak tam sayılara dönüştürün, ardından value1 değerini value2 değerine bölün ve sonucu yazdırın
  5. testType "array_access" ise: "Programming" dizesini oluşturun, std::stoi kullanarak value1 değerini bir tam sayı dizinine dönüştürün, ardından bu dizindeki karaktere erişmek ve yazdırmak için str.at(index) kullanın. .at() yöntemi, dizin geçersizse otomatik olarak std::out_of_range fırlatır: elle sınır denetimi yapmanız gerekmez
  6. testType "unknown_error" ise: 999 tam sayı değerini fırlatın
  7. Ana işlevde, performTest işlevini bir try bloğunun içinde çağırın
  8. İstisnaları aşağıdaki sırayla ele almak için birden fazla catch bloğu kullanın:
  9. İlk olarak: Geçersiz dizeden sayıya dönüştürme işlemleri için std::invalid_argument&
  10. İkinci olarak: Çok büyük sayılar veya sınırların dışındaki dize dizinleri için std::out_of_range&
  11. Üçü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 caught

Catch-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;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C++ derleyicisi