Menu
CoddyTech

Obsługa wszystkich wyjątków

Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 52 z 56.

Czasami Twój program może napotkać nieoczekiwane błędy, które nie pasują do konkretnych typów wyjątków, na które się przygotowałeś. Ogólny handler catch(...) stanowi zabezpieczenie, które przechwytuje każdy wyjątek, którego nie obsłużyły bardziej szczegółowe bloki catch.

Procedura obsługi przechwytująca wszystkie wyjątki używa trzech kropek (...) zamiast określania konkretnego typu wyjątku. Musi znajdować się za wszystkimi pozostałymi blokami catch, ponieważ C++ sprawdza je po kolei:

try {
    // Kod, który może zgłaszać różne wyjątki
} 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;
}

Procedura obsługi przechwytująca wszystkie wyjątki działa jako mechanizm awaryjny dla każdego typu wyjątku, który nie został przechwycony przez poprzednie bloki. Jest to szczególnie przydatne podczas pracy z kodem, który może zgłaszać wyjątki, których nie udało Ci się przewidzieć, dzięki czemu Twój program nie ulegnie awarii z powodu nieoczekiwanych błędów.

Chociaż nie możesz uzyskać dostępu do szczegółowych informacji o wyjątku w bloku przechwytującym wszystkie wyjątki, nadal możesz wyświetlić ogólny komunikat o błędzie i wykonać operacje porządkowe, aby program działał bez zakłóceń.

challenge icon

Wyzwanie

Łatwy

Utwórz program demonstrujący kompleksową obsługę wyjątków za pomocą wielu bloków catch, w tym procedury obsługi przechwytującej wszystkie wyjątki. To wyzwanie sprawdzi twoje zrozumienie obsługi zarówno konkretnych typów wyjątków, jak i nieoczekiwanych błędów, które nie pasują do zdefiniowanych wcześniej kategorii.

Podane zostaną następujące dane wejściowe:

  • Ciąg znaków testType określający typ testu do wykonania ("string_convert", "math_operation", "array_access" lub "unknown_error")
  • Ciąg znaków value1, który zostanie użyty jako główne dane dla operacji
  • Ciąg znaków value2, który zostanie użyty jako dodatkowe dane dla niektórych operacji

Twój program powinien:

  1. Utworzyć funkcję o nazwie performTest, która przyjmuje trzy parametry typu string
  2. Wewnątrz funkcji użyć struktury if-else do obsługi różnych typów testów:
  3. Jeśli testType ma wartość "string_convert": użyć std::stoi, aby przekonwertować value1 na liczbę całkowitą i ją wypisać
  4. Jeśli testType ma wartość "math_operation": przekonwertować value1 i value2 na liczby całkowite za pomocą std::stoi, następnie podzielić value1 przez value2 i wypisać wynik
  5. Jeśli testType ma wartość "array_access": utworzyć ciąg znaków "Programming", przekonwertować value1 na indeks typu całkowitego za pomocą std::stoi, następnie użyć str.at(index), aby uzyskać znak o tym indeksie i go wypisać. Metoda .at() automatycznie zgłasza wyjątek std::out_of_range, jeśli indeks jest nieprawidłowy: nie jest potrzebne ręczne sprawdzanie zakresu
  6. Jeśli testType ma wartość "unknown_error": zgłosić wartość całkowitą 999
  7. W funkcji main wywołać performTest wewnątrz bloku try
  8. Użyć wielu bloków catch do obsługi wyjątków w dokładnie tej kolejności:
  9. Najpierw: std::invalid_argument& w przypadku nieprawidłowych konwersji ciągu znaków na liczbę
  10. Po drugie: std::out_of_range& w przypadku liczb zbyt dużych lub indeksu ciągu znaków wykraczającego poza zakres
  11. Po trzecie: catch(...) jako procedura obsługi przechwytująca wszystkie pozostałe typy wyjątków

Użyj następującego dokładnego formatu wyjściowego:

W przypadku udanych operacji:

Success: [result_value]

W przypadku różnych typów wyjątków:

Invalid argument caught
Out of range caught
Unknown exception caught

Pamiętaj, że procedura obsługi przechwytująca wszystkie wyjątki catch(...) musi znajdować się na końcu, ponieważ C++ sprawdza bloki catch w kolejności. Ta procedura obsługi przechwyci każdy typ wyjątku, który nie został obsłużony przez wcześniejsze bloki catch przeznaczone dla konkretnych typów, w tym wyjątek całkowitoliczbowy zgłoszony w przypadku "unknown_error". Procedura obsługi przechwytująca wszystkie wyjątki stanowi zabezpieczenie przed nieoczekiwanymi błędami, a jednocześnie pozwala na szczególną obsługę znanych typów wyjątków.

Spróbuj swoich sił

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

// TODO: Napisz tutaj swój kod — utwórz funkcję performTest

int main() {
    // Wczytaj dane wejściowe
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: Napisz kod poniżej — zaimplementuj bloki try-catch i wywołaj performTest
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator C++ online