Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Catch-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 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 adında bir fonksiyon oluşturun
  2. Fonksiyonun içinde, farklı test türlerini işlemek için bir if-else yapısı kullanın:
  3. Eğer testType "string_convert" ise: value1'i bir tam sayıya dönüştürmek için std::stoi kullanın ve sonucu yazdırın
  4. Eğer testType "math_operation" ise: hem value1 hem de value2'yi std::stoi kullanarak tam sayılara dönüştürün, ardından value1'i value2'ye bölün ve sonucu yazdırın
  5. Eğer testType "array_access" ise: "Programming" dizesini oluşturun, value1'i std::stoi kullanarak bir tam sayı dizinine (index) dönüştürün, ardından o dizindeki karaktere erişmek için str.at(index) kullanın ve sonucu yazdırın. .at() yöntemi, dizin geçersizse otomatik olarak std::out_of_range fırlatır — manuel sınır kontrolüne gerek yoktur
  6. Eğer testType "unknown_error" ise: 999 tam sayı değerini fırlatın (throw)
  7. Ana fonksiyonda (main function), performTest fonksiyonunu bir try bloğu içinde çağırın
  8. İstisnaları tam olarak şu sırayla işlemek için birden fazla catch bloğu kullanın:
  9. Birinci: Geçersiz dizeden sayıya dönüştürmeler için std::invalid_argument&
  10. İkinci: Çok büyük sayılar veya dize dizini sınır dışı durumları için std::out_of_range&
  11. Üçü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 caught

C++ 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;
}
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