Słowo kluczowe „throw”
Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 50 z 56.
Czasami musisz zasygnalizować, że w Twoim własnym kodzie wystąpił błąd, zamiast tylko przechwytywać wyjątki zgłaszane przez inne funkcje. Słowo kluczowe throw pozwala ręcznie wywołać wyjątek, gdy program wykryje problem.
Możesz rzucać różnymi typami wartości jako wyjątkami — liczbami całkowitymi, ciągami znaków, a nawet własnymi obiektami. Oto podstawowa składnia:
if (someErrorCondition) {
throw "Error message"; // Rzuca literał łańcuchowy
}Gdy używasz throw, program natychmiast przestaje wykonywać bieżącą funkcję i szuka bloku catch, który może obsłużyć wyrzuconą wartość. Jest to szczególnie przydatne do sprawdzania poprawności danych wejściowych lub warunków, które nie powinny wystąpić podczas normalnego wykonywania programu.
Oto praktyczny przykład zgłaszania wyjątku po wykryciu nieprawidłowych danych wejściowych:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}Wywołujący umieszcza wywołanie w bloku try. Rzucony literał łańcuchowy ma typ const char*, więc taki typ podaje się w bloku catch, a jego parametr przechowuje komunikat:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// Wynik: Error: Age cannot be negative!Słowo kluczowe throw daje ci kontrolę nad tym, kiedy i w jaki sposób błędy są zgłaszane w twoich programach, dzięki czemu twoje funkcje są bardziej odporne i przewidywalne podczas obsługi nieprawidłowych warunków.
Wyzwanie
ŁatwyUtwórz program, który implementuje walidację danych wejściowych za pomocą słowa kluczowego throw, aby ręcznie zgłaszać wyjątki w przypadku wykrycia nieprawidłowych warunków. To wyzwanie sprawdzi, czy rozumiesz, jak używać throw do sygnalizowania błędów we własnych funkcjach.
Podane zostaną następujące dane wejściowe:
- Łańcuch znaków
usernamereprezentujący nazwę użytkownika wybraną przez użytkownika (ta linia może być pusta) - Liczba całkowita
agereprezentująca wiek użytkownika
Twój program powinien:
- Utworzyć funkcję o nazwie
validateUser, która przyjmuje jako parametry łańcuch znaków i liczbę całkowitą - Wewnątrz funkcji sprawdzić, czy nazwa użytkownika jest pusta (ma długość 0)
- Jeśli nazwa użytkownika jest pusta, użyć
throw, aby zgłosić łańcuch znaków"Username cannot be empty" - Sprawdzić, czy wiek jest mniejszy niż 13
- Jeśli wiek jest mniejszy niż 13, użyć
throw, aby zgłosić łańcuch znaków"Age must be at least 13" - Jeśli obie walidacje przejdą pomyślnie, wypisać
"User validation successful" - W funkcji głównej wywołać
validateUserz wartościami wejściowymi - Użyć bloku
trydo wywołania funkcji oraz blokucatchdo obsługi wszelkich wyjątków będących zgłoszonymi łańcuchami znaków
Użyj następującego dokładnego formatu wyjściowego:
W przypadku pomyślnej walidacji:
User validation successfulW przypadku błędów walidacji:
Validation error: [error_message]Pamiętaj, że gdy użyjesz throw, program natychmiast przestaje wykonywać bieżącą funkcję i szuka pasującego bloku catch. Blok catch powinien określać typ const char*, aby obsługiwać zgłoszone literały łańcuchowe. Jeśli pierwsza walidacja się nie powiedzie, funkcja zgłosi wyjątek i nie będzie kontynuować sprawdzania drugiego warunku.
Spróbuj swoich sił
#include <iostream>
#include <string>
using namespace std;
// TODO: Napisz tutaj funkcję validateUser, nad main
// Przyjmuje string username i int age oraz zgłasza literał tekstowy, gdy warunek sprawdzania nie jest spełniony
int main() {
// Wczytaj dane wejściowe
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: Wywołaj validateUser wewnątrz bloku try
// i przechwyć zgłoszony komunikat za pomocą catch (const char* error)
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