Menu
Coddy logo textTech

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 program obsługi catch(...) stanowi zabezpieczenie, które przechwytuje każdy wyjątek nieobsłużony przez bardziej szczegółowe bloki catch.

Procedura obsługi wszystkich wyjątków używa trzech kropek (...) zamiast określania konkretnego typu wyjątku. Musi być umieszczona po wszystkich pozostałych blokach 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 zabezpieczenie na wypadek 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 się nie spodziewasz, 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 obsługi przechwytującej wszystkie wyjątki. To wyzwanie sprawdzi, czy rozumiesz, jak obsługiwać zarówno konkretne typy wyjątków, jak i nieoczekiwane błędy, które nie pasują do wcześniej zdefiniowanych kategorii.

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

  • Łańcuch znaków testType określający typ testu do wykonania ("string_convert", "math_operation", "array_access" lub "unknown_error")
  • Łańcuch znaków value1, który zostanie użyty jako podstawowe dane operacji
  • Łańcuch znaków value2, który zostanie użyty jako dodatkowe dane w niektórych operacjach

Twój program powinien:

  1. Utworzyć funkcję o nazwie performTest, która przyjmuje trzy parametry typu łańcuch znaków
  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 do konwersji value1 na liczbę całkowitą i ją wypisać
  4. Jeśli testType ma wartość "math_operation": przekonwertować zarówno value1, jak 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ć łańcuch znaków "Programming", przekonwertować value1 na indeks całkowity za pomocą std::stoi, następnie użyć str.at(index), aby uzyskać znak pod tym indeksem i go wypisać. Metoda .at() automatycznie zgłasza wyjątek std::out_of_range, jeśli indeks jest nieprawidłowy: nie trzeba ręcznie sprawdzać granic
  6. Jeśli testType ma wartość "unknown_error": zgłosić wyjątek o wartości całkowitej 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 następującej dokładnej kolejności:
  9. Po pierwsze: std::invalid_argument& w przypadku nieprawidłowych konwersji z łańcucha znaków na liczbę
  10. Po drugie: std::out_of_range& w przypadku liczb zbyt dużych lub indeksu łańcucha znaków wykraczającego poza zakres
  11. Po trzecie: catch(...) jako obsługa przechwytująca wszystkie inne typy wyjątków

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

W przypadku pomyślnych 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 obsługa przechwytująca wszystkie wyjątki catch(...) musi znajdować się na końcu, ponieważ C++ sprawdza bloki catch po kolei. Ta obsługa przechwyci każdy typ wyjątku, który nie został obsłużony przez wcześniejsze bloki catch dla konkretnych typów, w tym wyjątek całkowity zgłaszany w przypadku "unknown_error". Obsługa przechwytująca wszystkie wyjątki stanowi zabezpieczenie przed nieoczekiwanymi błędami, a jednocześnie pozwala na konkretne postępowanie ze znanymi typami 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 swój 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