Obsługa wyjątków C ++: Try, Catch, throw Przykład

Spisie treści:

Anonim

Co to jest obsługa wyjątków w C ++?

Obsługa wyjątków w C ++ zapewnia sposób obsługi nieoczekiwanych okoliczności, takich jak błędy w czasie wykonywania. Dlatego za każdym razem, gdy wystąpią nieoczekiwane okoliczności, sterowanie programem jest przenoszone do specjalnych funkcji zwanych programami obsługi.

Aby wychwycić wyjątki, umieszczasz część kodu pod inspekcją 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 funkcja obsługi wyjątków przejmie kontrolę nad programem.

Jeśli nie wystąpią żadne wyjątkowe okoliczności, kod zostanie wykonany normalnie. Podręczniki zostaną zignorowane.

W tym samouczku C ++ nauczysz się:

  • Co to jest obsługa wyjątków w C ++?
  • Dlaczego obsługa wyjątków?
  • Słowa kluczowe obsługi wyjątków
  • Składnia:
  • Wyjątki w standardzie C ++
  • Wyjątki zdefiniowane przez użytkownika

Dlaczego obsługa wyjątków?

Oto powód używania obsługi wyjątków w C ++:

  • Oddzielisz kod obsługi błędów od 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łasza wiele wyjątków, obsłuży tylko niektóre. Rozmówca 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:

  • throw - gdy program napotka problem, zgłasza wyjątek. Słowo kluczowe throw pomaga programowi wykonać rzut.
  • catch - program używa obsługi wyjątków do przechwytywania wyjątków. Jest dodawany do sekcji programu, w której musisz rozwiązać problem. Robi się to za pomocą słowa kluczowego catch.
  • try - blok try identyfikuje blok kodu, dla którego zostaną aktywowane określone wyjątki. Powinien po nim następować 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 and catch. Blok try / catch powinien otaczać kod, który może zgłosić wyjątek. Taki kod jest nazywany 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.
  • ExceptionName to nazwa wyjątku, który ma zostać przechwycony.
  • Wyjątek1, wyjątek2 i wyjątekN to zdefiniowane przez Ciebie nazwy do odwoływania się do wyjątków.

Przykład 1:

#include#includeusing namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do programu, aby móc korzystać z jego funkcji.
  2. Dołącz plik nagłówka wektorowego do programu, aby móc korzystać z jego funkcji.
  3. Dołącz przestrzeń nazw std w programie do jego klas bez wywoływania jej.
  4. Wywołaj funkcję main (). Logikę programu należy dodać w jego treści.
  5. Utwórz wektor o nazwie vec do przechowywania danych całkowitych.
  6. Dodaj element 0 do wektora o nazwie vec.
  7. Dodaj element 1 do wektora o nazwie vec.
  8. Komentarz. Zostanie pominięty przez kompilator C ++.
  9. Użyj instrukcji try, aby złapać wyjątek. {Oznacza początek treści bloku try / catch. Kod dodany w treści stanie się kodem chronionym.
  10. Spróbuj uzyskać dostęp do elementu przechowywanego pod indeksem 2 (trzeci element) wektora o nazwie vec. Ten element nie istnieje.
  11. Koniec treści bloku try / catch.
  12. Złap wyjątek. Zwrócony komunikat o błędzie zostanie zapisany w zmiennej ex.
  13. Wydrukuj wiadomość na konsoli, jeśli wyjątek zostanie przechwycony.
  14. Koniec korpusu zatrzasku.
  15. Program powinien zwrócić wartość po pomyślnym wykonaniu.
  16. Koniec treści funkcji main ().

Przykład 2:

#include 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;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do programu, aby móc korzystać z jego funkcji.
  2. Dołącz przestrzeń nazw std w programie do jego klas bez wywoływania jej.
  3. Utwórz funkcję o nazwie zeroDivision, która przyjmuje dwa argumenty w postaci liczb całkowitych, x i y. Funkcja powinna zwrócić podwójny wynik.
  4. Użyj instrukcji if, aby sprawdzić, czy wartość argumentu y zmiennej wynosi 0. Znak {oznacza początek treści if.
  5. Wiadomość do zwrócenia / wyrzucenia, jeśli y wynosi 0.
  6. Koniec treści instrukcji if.
  7. Funkcja zeroDivision powinna zwrócić wartość x / y.
  8. Koniec treści funkcji zeroDivision.
  9. Wywołaj metodę main (). {Oznacza początek tej metody.
  10. Zadeklaruj zmienną całkowitą i przypisz jej wartość 11.
  11. Zadeklaruj zmienną całkowitą b i przypisz jej wartość 0.
  12. Zadeklaruj podwójną zmienną c i przypisz jej wartość 0.
  13. Użyj instrukcji try, aby złapać wyjątek. {Oznacza początek treści bloku try / catch. Kod dodany w treści stanie się kodem chronionym.
  14. Wywołaj funkcję zeroDivision i przekaż do argumentów a i b, czyli 11 i 0. Wynik tej operacji będzie przechowywany w zmiennej c.
  15. Wydrukuj wartość zmiennej c na konsoli.
  16. Koniec treści bloku try / catch.
  17. Złap wyjątek. Zwrócony komunikat o błędzie zostanie zapisany w zmiennej wiadomości.
  18. Wydrukuj zwrócony komunikat o błędzie na konsoli.
  19. Koniec korpusu zatrzasku.
  20. Program powinien zwrócić wartość po pomyślnym wykonaniu.
  21. Koniec treści funkcji main ().

Wyjątki w standardzie C ++

C ++ zawiera listę standardowych wyjątków zdefiniowanych w klasie . Są one opisane poniżej:

Wyjątek Opis
std :: wyjątek To jest wyjątek i klasa nadrzędna wszystkich standardowych wyjątków C ++.
std :: bad_alloc Ten wyjątek jest zgłaszany przez nowe słowo kluczowe.
std :: bad_cast To jest wyjątek zgłoszony przez dynamic_cast.
std :: bad_exception Przydatne urządzenie do obsługi nieoczekiwanych wyjątków w programach C ++.
std :: bad_typeid Wyjątek zgłoszony przez identyfikator typu.
std :: logic_error Ten wyjątek jest teoretycznie wykrywalny poprzez odczyt kodu.
std :: domain_error Jest to wyjątek zgłaszany po użyciu matematycznie nieprawidłowej domeny.
std :: invalid_argument Zgłoszono wyjątek za użycie nieprawidłowych argumentów.
std :: length_error Wyjątek zgłoszony po utworzeniu dużego std :: string.
std :: out_of_range Rzucone 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 generowany podczas 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

Klasa C ++ std ::ception pozwala nam definiować obiekty, które mogą być wyrzucane jako wyjątki. Ta klasa została zdefiniowana w nagłówku . Klasa zapewnia nam wirtualną funkcję składową o nazwie what.

Ta funkcja zwraca zakończoną znakiem null sekwencję znaków typu char *. Możemy go nadpisać w klasach pochodnych, aby mieć opis wyjątku.

Przykład:

#include #include 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;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do naszego programu. Będziemy korzystać z jego funkcji bez błędów.
  2. Dołącz plik nagłówkowy wyjątku do naszego programu. Będziemy korzystać z jego funkcji bez błędów.
  3. Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
  4. Utwórz nową klasę o nazwie newException. Ta klasa dziedziczy klasę wyjątków języka C ++.
  5. Początek treści klasy.
  6. 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.
  7. Rozpocznij definicję nowego wyjątku.
  8. Komunikat, który ma zostać zwrócony, jeśli zostanie przechwycony nowy wyjątek.
  9. Koniec definicji nowego wyjątku.
  10. Koniec treści klasy newException. Newex to nazwa, która ma być użyta do przechwycenia naszego nowego wyjątku, po którym zostanie wywołany nowy wyjątek.
  11. Wywołaj funkcję main (). Logikę programu należy dodać w jego treści. {Oznacza początek jego treści.
  12. Użyj instrukcji try, aby zaznaczyć kod, w którym musimy oznaczyć wyjątek. {Oznacza początek treści bloku try / catch. Kod otoczony tym będzie chroniony.
  13. Wyrzuć wyjątek newex, jeśli zostanie przechwycony.
  14. Koniec treści próbnej.
  15. Użyj instrukcji catch, aby złapać wyjątek. Komunikat o błędzie wyjątku zostanie zapisany w zmiennej ex.
  16. Wydrukuj komunikat o błędzie wyjątku na konsoli.
  17. Koniec treści instrukcji catch.
  18. Program powinien zwrócić wartość, jeśli zostanie wykonany pomyślnie.
  19. Koniec treści funkcji main ().

Podsumowanie:

  • Z obsługą wyjątków w C ++ można obsługiwać błędy w czasie wykonywania.
  • Błędy czasu wykonania to błędy występujące podczas wykonywania programu.
  • Obsługa wyjątków pomaga radzić sobie z nieoczekiwanymi okolicznościami w programie.
  • Gdy wystąpią nieoczekiwane okoliczności, sterowanie programem jest przekazywane do obsługi.
  • Aby złapać wyjątek, umieszczasz sekcję kodu pod blokiem try-catch.
  • Słowo kluczowe throw pomaga programowi zgłaszać wyjątki, pomagając programowi w rozwiązaniu problemu.
  • Słowo kluczowe try pomaga zidentyfikować blok kodu, dla którego zostaną aktywowane określone wyjątki.
  • Możemy nadpisać funkcję what () pliku nagłówkowego wyjątku, aby zdefiniować nasze wyjątki.