Wyjątki niestandardowe C++

Wyjatki Niestandardowe C



Wyjątek w C++ jest podstawową koncepcją. Wyjątek występuje w czasie wykonywania, gdy program napotka niespójności w czasie wykonywania lub nietypowe scenariusze. W C++ terminy „rzut”, „try” i „złapanie” są używane do obsługi lub przechwytywania wyjątku. Do wygenerowania wyjątku służy polecenie „throw”. Termin „try” służy do zgłaszania wyjątku, a słowo kluczowe „catch” reprezentuje obsługę wyjątku, który jest tworzony za pomocą terminu „throw” i jest zgłaszany przez sekcję „try”. Przyjrzyjmy się kilku przykładom, aby zademonstrować wyjątki w C++.

Przykład 1: Program do tworzenia niestandardowej klasy wyjątków w C++

Ten prosty przykład zaimplementowano w celu zademonstrowania niestandardowej obsługi i wykrywania wyjątków w języku C++.

#include
#include
za pomocą przestrzeń nazw st ;

klasa Wyjątek Demo : publiczny wyjątek
{
wirtualny konst zwęglać * Co ( ) konst rzucić ( )
{
powrót „Wychwycony wyjątek niestandardowy” ;
}
} ;
wew główny ( )
{
DemoException dEx ;
próbować
{
rzucić dEx ;
}
złapać ( wyjątek & z wyjątkiem )
{
cout << z wyjątkiem. Co ( ) << koniec ;
}
powrót 0 ;
}

Definiujemy plik nagłówkowy w kodzie zawierający „iostream” i „wyjątek”. „iostream” jest wywoływany specjalnie dla strumienia wejściowego i wyjściowego, podczas gdy biblioteka „wyjątków” jest wywoływana w celu obsługi wyjątku. Następnie tworzymy klasę „DemoException”, która wywodzi się z klasy „wyjątek” języka C++. Tutaj ustawiamy wirtualną funkcję what(), która jest używana do udostępniania const char*, która wyświetla wyniki komunikatu o błędzie powiązanego z wyjątkiem.







Następnie wywołujemy funkcję main(), w której tworzymy obiekt „dEx” klasy „DemoException”. Następnie mamy definicję bloku „try”, która zgłasza wyjątek, jeśli zostanie napotkany. Tutaj rzucamy obiekt „dEx”.



Następnie ustawiamy blok „catch”, aby przechwycił wyjątek i obsłużył go. Odniesienie do wyjątku klasy przekazujemy jako parametr umożliwiający przechwycenie wyjątku, który jest z niego wyprowadzony. Wewnątrz bloku „catch” wywołujemy funkcję what() na „except”, aby wyświetlić na konsoli komunikat o wyjątku.



Po uruchomieniu danego programu przechwytywany jest niestandardowy komunikat wyjątku i rzucany na konsolę:





Przykład 2: Program tworzący niestandardowy wyjątek przy użyciu dwóch klas

Program kładzie nacisk na radzenie sobie z wieloma wyjątkami, które mogą być obsługiwane niezależnie poprzez zdefiniowanie wielu klas.



#include
za pomocą przestrzeń nazw st ;

klasa ocena1 { } ;
klasa ocena2 { } ;

wew główny ( ) {
próbować {
rzucić ocena1 ( ) ;
}
złapać ( ocena1 mi ) {
cout << „Wychwycono wyjątek Evaluation1!” << koniec ;
}
próbować {
rzucić ocena2 ( ) ;
}
złapać ( ocena2 mi ) {
cout << „Wychwycono wyjątek oceny 2!” << koniec ;
}

powrót 0 ;
}

W podanym kodzie mamy definicję dwóch klas „Evaluation1” i „Evaluation2”, które są teraz puste. Następnie wykonujemy funkcję main() programu. Tutaj ustawiamy blok try{}, w którym słowo kluczowe „throw” służy do zgłaszania instancji klasy „Evaluation1()”. Oznacza to, że wyjątek „Evaluation1” jest zgłaszany, jeśli w programie pojawi się jakikolwiek wyjątek wewnątrz tego bloku „try”. Następnie mamy blok catch{}, w którym wyjątek zostaje przechwycony i wyświetla komunikat o wyjątku.

Podobnie mamy definicję kolejnego bloku try{} dla klasy „Evaluation2”. Wewnątrz bloku try{} rzucamy instancję klasy „Evaluation2”. Spowoduje to zgłoszenie wyjątku „Evaluation2”, jeśli wystąpi tutaj błąd. Następnie wywołujemy blok catch{}, aby wyświetlić komunikat o wyjątku za pomocą polecenia „cout”, jeśli wyjątek zostanie złapany w tym bloku.

W konsoli zgłaszane są dwa wyjątki różnych bloków „try-catch”, które są obsługiwane przez dwie różne klasy.

Przykład 3: Program tworzący niestandardowy wyjątek za pomocą konstruktora

Program używa konstruktora do obsługi wyjątku. Chociaż nie możemy uzyskać wartości z konstruktora, możemy to osiągnąć za pomocą bloku „try-catch”.

#include
za pomocą przestrzeń nazw st ;

klasa Test {
wew wal ;

publiczny :
Test ( wew N )
{
próbować {
Jeśli ( N == 0 )
wal = N ;
wyświetlacz ( ) ;
}

złapać ( konst zwęglać * do potęgi ) {
cout << „Znaleziono wyjątek \N ' ;
cout << do potęgi << koniec ;
}

}

próżnia wyświetlacz ( )
{
cout << „Wartość =” << wal << koniec ;
}
} ;

wew główny ( )
{

Test ( 0 ) ;
cout << „Ponowne tworzenie instancji \N ' ;
Test ( 1 ) ;
}

W podanym kodzie ustalamy klasę „Test”, w której zmienna jest deklarowana jako „val” typu integer. Następnie mamy definicję funkcji konstruktora „Test()”, która jest przekazywana ze zmienną „n”. Następnie ustawiamy blok „try-catch” w funkcji konstruktora „Test()”. Blok try wywoływany jest za pomocą instrukcji if(). Jeśli wartość „n” jest równa zero, blok „catch” przechwyci wyjątek, a komunikat o wyjątku zostanie zgłoszony w wierszu zachęty. Wartość „n” jest przechowywana w zmiennej „val” podczas jej inicjalizacji.

Następnie wywołujemy funkcję display(), aby pokazać wartość przechowywaną w zmiennej „val”. Następnie mamy definicję bloku „catch”, w którym obsługiwany jest wyjątek zgłoszony przez blok „try”. Na koniec wywołujemy funkcję main(). Wewnątrz którego wywołujemy konstruktor „Test()”. Konstruktor jest wywoływany w momencie utworzenia obiektu klasy „Test()” i określenia go wartością „0”, dla której zgłaszany jest wyjątek.

Następnie ponownie wywołujemy klasę „Test()”, aby utworzyć instancję, która zostanie przekazana z wartością 1. W tym przypadku konstruktor nie zgłosi żadnego wyjątku, ponieważ wartość nie jest równa 0. Funkcja display() wykonaj i wydrukuj wartość „val”.

Niestandardowy wyjątek jest zgłaszany na konsoli poprzez wywołanie konstruktora. Ponadto, gdy warunek jest spełniony, konstruktor wykonuje się bez żadnego wyjątku.

Przykład 4: Program tworzący wyjątek niestandardowy zdefiniowany przez użytkownika

Program obsługuje i przechwytuje wyjątek zdefiniowany przez użytkownika w odpowiedzi na pytanie.

#include
#include
za pomocą przestrzeń nazw st ;
klasa Moje Demo : publiczny wyjątek {
publiczny :
konst zwęglać * Co ( ) konst rzucić ( )
{
powrót „Wyjątek! Próbowałem dzielić przez zero.! \N ' ;
}
} ;
wew główny ( )
{
próbować
{
wew n1, n2 ;
cout << „Wprowadź dwie liczby całkowite: \N ' ;
jedzenie >> n1 >> n2 ;
Jeśli ( n2 == 0 )
{
Moje Demo n3 ;
rzucić n3 ;
}
w przeciwnym razie
{
cout << „n1/n2 =” << n1 / n2 << koniec ;
}
}
złapać ( wyjątek & eks )
{
cout << eks. Co ( ) ;
}
}

W podanym kodzie najpierw definiujemy klasę „MyDemo()”, która jest klasą zależną wyjątku. Następnie ustawiamy publiczną funkcję what() za pomocą słowa kluczowego „virtual”. Funkcja what() jest wywoływana w celu uzyskania przyczyny wyjątku w programie, gdy funkcja Throw() zgłasza wyjątek. Następnie mamy funkcję main(), w której zdefiniowano bloki try-catch{} w celu wykrycia i obsługi wyjątku. W bloku try{} deklarujemy dwie zmienne „n1” i „n2”, których wartości pobierane są od użytkownika za pomocą polecenia „cin”. Kiedy zostaną odebrane wartości dla każdej zmiennej „n1” i „n2”, warunek „if” sprawdzi, czy zmienna „n2” jest równa 0, czy nie. Jeśli tak, zgłaszany jest wyjątek lub zwracane są wyniki dzielenia. Na koniec mamy blok catch{}, który przyjmuje odwołanie do klasy „wyjątek” jako parametr z niej dziedziczony.

Dane wyjściowe pokazują, kiedy warunek nie jest spełniony, a program jest wykonywany bez wyjątku:

Definiujemy także wartość „0” zmiennej „n2”, która reprezentuje sposób zgłaszania i przechwytywania wyjątku w programie.

Wniosek

Podsumowując, zademonstrowaliśmy ważną koncepcję języka C++, który stanowi wyjątek. Wyjątek utrudnia normalne wykonanie programu. W tym celu użyliśmy słów kluczowych „throw”, „try” i „catch”, aby obsłużyć wyjątek występujący w programie. Użyliśmy tych słów kluczowych w poprzednich przykładach, aby inaczej obsłużyć wyjątek.