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ń.
Wyzwanie
ŁatwyUtwó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
testTypeokreś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:
- Utworzyć funkcję o nazwie
performTest, która przyjmuje trzy parametry typu string - Wewnątrz funkcji użyć struktury if-else do obsługi różnych typów testów:
- Jeśli testType ma wartość
"string_convert": użyćstd::stoi, aby przekonwertować value1 na liczbę całkowitą i ją wypisać - 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 - 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ątekstd::out_of_range, jeśli indeks jest nieprawidłowy: nie jest potrzebne ręczne sprawdzanie zakresu - Jeśli testType ma wartość
"unknown_error": zgłosić wartość całkowitą999 - W funkcji main wywołać
performTestwewnątrz blokutry - Użyć wielu bloków
catchdo obsługi wyjątków w dokładnie tej kolejności: - Najpierw:
std::invalid_argument&w przypadku nieprawidłowych konwersji ciągu znaków na liczbę - Po drugie:
std::out_of_range&w przypadku liczb zbyt dużych lub indeksu ciągu znaków wykraczającego poza zakres - 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 caughtPamię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;
}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
1Wskaźniki i pamięć
Czym jest wskaźnik?Operator pobrania adresuOperator dereferencjiWskaźniki zeroweWskaźniki i tabliceDynamiczne zarządzanie pamięcią za pomocą „new”Zwalnianie pamięci za pomocą „delete”Podsumowanie — ćwiczenia ze wskaźnikami2Wektory (tablice dynamiczne)
Wprowadzenie do std::vectorTworzenie wektoraDodawanie elementówDostęp do elementówRozmiar wektoraIterowanie za pomocą pętli forPętla for oparta na zakresieUsuwanie elementówPodsumowanie — operacje na wektorach5Projekt: Narzędzie do zarządzania zapasami
Konfiguracja projektuDodawanie i aktualizowanie produktów8Podstawy obsługi błędów
Wprowadzenie do wyjątkówBloki „try” i „catch”Słowo kluczowe „throw”Różne typy wyjątkówObsługa wszystkich wyjątkówPodsumowanie — bezpieczne dzielenie3Projekt: narzędzie do listy zadań
Przegląd projektuDodawanie zadaniaPoćwicz samodzielnie: Kompilator C++ online