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. 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.

challenge icon

Görev

Kolay

Bir 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:

  1. Üç string parametresi alan performTest adlı bir function oluştur
  2. Function içinde, farklı test türlerini ele almak için bir if-else yapısı kullan:
  3. testType "string_convert" ise: value1 değerini bir tamsayıya dönüştürmek ve yazdırmak için std::stoi kullan
  4. testType "math_operation" ise: hem value1 hem de value2 değerlerini std::stoi kullanarak tamsayılara dönüştür, ardından value1 değerini value2 değerine böl ve result değerini yazdır
  5. testType "array_access" ise: "Programming" adlı bir string oluştur, value1 değerini std::stoi kullanarak bir tamsayı index değerine dönüştür, ardından o index konumundaki karaktere erişmek ve yazdırmak için str.at(index) kullan. .at() methodu, index invalid olduğunda otomatik olarak std::out_of_range fırlatır: manuel sınır kontrolü gerekmez
  6. testType "unknown_error" ise: 999 tamsayı değerini fırlat
  7. main function içinde performTest çağrısını bir try bloğunun içinde gerçekleştir
  8. Exception'ları şu kesin sırayla ele almak için birden fazla catch bloğu kullan:
  9. Birinci: Geçersiz string-to-number dönüşümleri için std::invalid_argument&
  10. İkinci: too large sayılar veya sınırların dışındaki string index değerleri için std::out_of_range&
  11. Üçü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 caught

catch-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;
}
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