C++ Obsługa wyjątków: spróbuj, złap, rzuć Przykład
Na czym polega obsługa wyjątków C++?
Obsługa wyjątków w C++ zapewnia sposób radzenia sobie z nieoczekiwanymi okolicznościami, takimi jak błędy w czasie wykonywania. Zatem zawsze, gdy wystąpi nieoczekiwana okoliczność, kontrola programu jest przekazywana specjalnym funkcjom znanym jako procedury obsługi.
Aby wychwycić wyjątki, poddajesz pewną sekcję kodu kontroli wyjątków. Sekcja kodu jest umieszczana w bloku try-catch.
Jeśli w tej sekcji kodu wystąpi wyjątkowa sytuacja, zostanie zgłoszony wyjątek. Następnie procedura obsługi wyjątków przejmie kontrolę nad programem.
Jeśli nie wystąpią żadne wyjątkowe okoliczności, kod zostanie wykonany normalnie. Osoby obsługujące zostaną zignorowane.
W tym C++ tutorial, dowiesz się:
Dlaczego obsługa wyjątków?
Oto powód użycia obsługi wyjątków C++:
- Oddzielisz swój kod obsługi błędów od swojego normalnego kodu. Kod będzie bardziej czytelny i łatwiejszy w utrzymaniu.
- Funkcje mogą obsługiwać wybrane przez siebie wyjątki. Nawet jeśli funkcja zgłosi wiele wyjątków, obsłuży tylko niektóre. Obiekt wywołujący obsłuży nieprzechwycone wyjątki.
Słowa kluczowe obsługi wyjątków
Obsługa wyjątków w C++ obraca się wokół tych trzech słów kluczowych:
- rzucać– gdy program napotka problem, zgłasza wyjątek. Słowo kluczowe Throw pomaga programowi wykonać rzut.
- łapać– program używa procedury obsługi wyjątków w celu przechwycenia wyjątku. Jest dodawany do sekcji programu, w której należy uporać się z problemem. Odbywa się to za pomocą słowa kluczowego catch.
- próbować– blok try identyfikuje blok kodu, dla którego zostaną aktywowane określone wyjątki. Po nim powinien nastąpić jeden/więcej bloków catch.
Załóżmy, że blok kodu zgłosi wyjątek. Wyjątek zostanie przechwycony przez metodę wykorzystującą słowa kluczowe try i catch. Blok try/catch powinien otaczać kod, który może zgłosić wyjątek. Taki kod nazywany jest kodem chronionym.
Składnia
Try/catch przyjmuje następującą składnię:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Chociaż mamy jedną instrukcję try, możemy mieć wiele instrukcji catch.
- NazwaWyjątku to nazwa wyjątku, który ma zostać przechwycony.
- Wyjątek1, wyjątek2 i wyjątekN to zdefiniowane przez Ciebie nazwy odnoszące się do wyjątków.
1 przykład:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy iostream do programu, aby go użyć Funkcje.
- Dołącz plik nagłówkowy wektora do programu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std w programie do jego klas bez wywoływania jej.
- Wywołaj funkcję main(). Logikę programu należy dodać w jego treści.
- Utwórz wektor o nazwie vec do przechowywania danych całkowitych.
- Dodaj element 0 do wektora o nazwie vec.
- Dodaj element 1 do wektora o nazwie vec.
- Komentarz. Zostanie pominięty przez C++ kompilator.
- Użyj instrukcji try, aby złapać wyjątek. Znak { oznacza początek treści bloku try/catch. Kod dodany w treści stanie się kodem chronionym.
- Spróbuj uzyskać dostęp do elementu przechowywanego pod indeksem 2 (trzeci element) wektora o nazwie vec. Ten element nie istnieje.
- Koniec treści bloku try/catch.
- Złap wyjątek. Zwrócony komunikat o błędzie zostanie zapisany w zmiennej ex.
- Wydrukuj komunikat na konsoli, jeśli zostanie złapany wyjątek.
- Koniec korpusu bloku zaczepowego.
- Program powinien zwrócić wartość po pomyślnym wykonaniu.
- Koniec treści funkcji main().
2 przykład:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy iostream do programu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std w programie do jego klas bez wywoływania jej.
- Utwórz funkcję o nazwie zeroDivision, która przyjmuje dwa argumenty całkowite, x i y. Funkcja powinna zwrócić wynik typu double.
- Użyj instrukcji if, aby sprawdzić, czy wartość argumentu zmiennej y wynosi 0. { oznacza początek treści if.
- Komunikat, który ma zostać zwrócony/wyrzucony, jeśli y wynosi 0.
- Koniec treści instrukcji if.
- Funkcja zeroDivision powinna zwracać wartość x/y.
- Koniec treści funkcji zeroDivision.
- Wywołaj metodę main(). { oznacza początek tej metody.
- Zadeklaruj zmienną całkowitą i przypisz jej wartość 11.
- Zadeklaruj zmienną całkowitą b i przypisz jej wartość 0.
- Zadeklaruj zmienną typu double c i przypisz jej wartość 0.
- Użyj instrukcji try, aby złapać wyjątek. Znak { oznacza początek treści bloku try/catch. Kod dodany w treści stanie się kodem chronionym.
- Wywołaj funkcję zeroDivision i przekaż argumentom a i b, czyli 11 i 0. Wynik tej operacji zostanie zapisany w zmiennej c.
- Wydrukuj wartość zmiennej c na konsoli.
- Koniec treści bloku try/catch.
- Złap wyjątek. Zwrócony komunikat o błędzie zostanie zapisany w zmiennej Message.
- Wydrukuj zwrócony komunikat o błędzie na konsoli.
- Koniec korpusu bloku zaczepowego.
- Program powinien zwrócić wartość po pomyślnym wykonaniu.
- Koniec treści funkcji main().
C++ Standardowe wyjątki
C++ zawiera listę standardowych wyjątków zdefiniowanych w klasa. Są one opisane poniżej:
Wyjątek | Opisy Konstrukcyjne |
---|---|
std::wyjątek | Jest to wyjątek i klasa nadrzędna wszystkich standardów C++ wyjątki. |
std::bad_alloc | Ten wyjątek jest zgłaszany przez nowe słowo kluczowe. |
std::bad_cast | Jest to wyjątek zgłoszony przez dynamic_cast. |
std::zły_wyjątek | Przydatne urządzenie do obsługi nieoczekiwanych wyjątków w C++ programy. |
std::bad_typeid | Wyjątek zgłoszony przez typeid. |
std::logic_error | Ten wyjątek jest teoretycznie wykrywalny poprzez odczytanie kodu. |
std::błąd_domeny | Jest to wyjątek zgłoszony po użyciu matematycznie nieprawidłowej domeny. |
std::nieprawidłowy_argument | Zgłoszono wyjątek w przypadku użycia nieprawidłowych argumentów. |
std::length_error | Wyjątek zgłoszony po utworzeniu dużego std::string. |
std::out_of_range | Wyrzucony przez metodę. |
std::runtime_error | Jest to wyjątek, którego nie można wykryć poprzez odczytanie kodu. |
std::overflow_error | Ten wyjątek jest zgłaszany po wystąpieniu przepełnienia matematycznego. |
std::range_error | Ten wyjątek jest zgłaszany w przypadku próby zapisania wartości spoza zakresu. |
std::underflow_error | Wyjątek zgłoszony po wystąpieniu niedomiaru matematycznego. |
Wyjątki zdefiniowane przez użytkownika
C++ Klasa std::exception pozwala nam definiować obiekty, które mogą być zgłaszane jako wyjątki. Klasa ta została zdefiniowana w chodnikowiec. Klasa udostępnia nam wirtualną funkcję składową o nazwie what.
Ta funkcja zwraca sekwencję znaków typu char *, zakończoną znakiem null. Możemy go nadpisać w klasach pochodnych, aby uzyskać opis wyjątku.
Przykład:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy iostream do naszego programu. Będziemy korzystać z jego funkcji bez popełniania błędów.
- Dołącz plik nagłówkowy wyjątku do naszego programu. Będziemy korzystać z jego funkcji jak co bez błędów.
- Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
- Utwórz nową klasę o nazwie newException. Ta klasa dziedziczy klasę wyjątku C++.
- Początek ciała klasy.
- Zastąp wirtualną funkcję członkowską what() zdefiniowaną w pliku nagłówkowym wyjątku. Następnie opiszemy nasz własny wyjątek, nowy wyjątek.
- Rozpocznij definicję nowego wyjątku.
- Komunikat, który ma zostać zwrócony w przypadku przechwycenia nowego wyjątku.
- Koniec definicji nowego wyjątku.
- Koniec treści klasy newException. Newex to nazwa, która ma zostać użyta do przechwycenia naszego nowego wyjątku, po czym zostanie wywołany nowy wyjątek.
- Wywołaj funkcję main(). Logikę programu należy dodać w jego treści. { oznacza początek treści.
- Użyj instrukcji try, aby zaznaczyć kod, w którym musimy oznaczyć wyjątek. Znak { oznacza początek treści bloku try/catch. Kod otoczony tym będzie chroniony.
- Zgłoś wyjątek newex, jeśli zostanie przechwycony.
- Koniec treści próby.
- Użyj instrukcji catch, aby przechwycić wyjątek. Komunikat o błędzie wyjątku zostanie zapisany w zmiennej ex.
- Wydrukuj komunikat o błędzie wyjątku na konsoli.
- Koniec treści instrukcji catch.
- Program powinien zwrócić wartość, jeśli zostanie pomyślnie wykonany.
- Koniec treści funkcji main().
Podsumowanie
- Z obsługą wyjątków w C++, możesz obsłużyć błędy czasu wykonania.
- Błędy wykonawcze to błędy występujące podczas wykonywania programu.
- Obsługa wyjątków pomaga poradzić sobie z nieoczekiwanymi okolicznościami w programie.
- Gdy wystąpi nieoczekiwana okoliczność, kontrola programu jest przekazywana do obsługi.
- Aby złapać wyjątek, umieszczasz sekcję kodu pod blokiem try-catch.
- Słowo kluczowe rzut pomaga programowi zgłaszać wyjątki, pomagając programowi uporać się z problemem.
- Słowo kluczowe try pomaga zidentyfikować blok kodu, dla którego zostaną aktywowane określone wyjątki.
- Możemy zastąpić funkcję what() pliku nagłówkowego wyjątku, aby zdefiniować nasze wyjątki.