C++ Unntakshåndtering: Prøv, fang, kast Eksempel

Hva er unntakshåndtering i C++?

Unntakshåndtering i C++ gir deg en måte å håndtere uventede omstendigheter som kjøretidsfeil. Så hver gang en uventet omstendighet oppstår, overføres programkontrollen til spesielle funksjoner kjent som behandlere.

For å fange opp unntakene, plasserer du en del av koden under unntaksinspeksjon. Kodedelen er plassert i try-catch-blokken.

Hvis en eksepsjonell situasjon oppstår innenfor den delen av koden, vil et unntak bli kastet. Deretter vil unntaksbehandleren overta kontrollen over programmet.

I tilfelle ingen eksepsjonelle omstendigheter inntreffer, vil koden kjøres normalt. Behandlerne vil bli ignorert.

I dette C++ opplæring, vil du lære:

Hvorfor unntakshåndtering?

Her er grunnen til å bruke Exception Handling i C++:

  • Du vil skille feilhåndteringskoden fra den vanlige koden. Koden vil være mer lesbar og enklere å vedlikeholde.
  • Funksjoner kan håndtere unntakene de velger. Selv om en funksjon gir mange unntak, vil den bare håndtere noen. Den som ringer vil håndtere de uoppdagede unntakene.

Nøkkelord for håndtering av unntak

Unntakshåndtering i C++ dreier seg om disse tre søkeordene:

  • kaste– når et program støter på et problem, gir det et unntak. Nøkkelordet kast hjelper programmet med å utføre kastet.
  • å fange– et program bruker en unntaksbehandler for å fange opp et unntak. Det legges til delen av et program der du må håndtere problemet. Det gjøres ved å bruke søkeordet catch.
  • prøve– prøveblokken identifiserer kodeblokken som visse unntak vil bli aktivert for. Den skal følges av en/flere fangblokker.

Anta at en kodeblokk vil gi et unntak. Unntaket vil bli fanget opp av en metode som bruker try and catch-søkeord. Prøv/fangst-blokken skal omgi kode som kan gi et unntak. Slik kode er kjent som beskyttet kode.

syntax

Try/catch tar denne syntaksen:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Selv om vi har én try-setning, kan vi ha mange catch-setninger.
  • ExceptionName er navnet på unntaket som skal fanges opp.
  • Unntak1, unntak2 og unntakN er dine definerte navn for å referere til unntakene.

Eksempel 1:

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

Utgang:

Nøkkelord for håndtering av unntak

Her er et skjermbilde av koden:

Nøkkelord for håndtering av unntak

Kodeforklaring:

  1. Inkluder iostream-headerfilen i programmet for å bruke dens funksjoner.
  2. Inkluder vektoroverskriftsfilen i programmet for å bruke funksjonene.
  3. Inkluder std-navneområdet i programmet til klassene uten å kalle det.
  4. Kalle hoved()-funksjonen. Programlogikken bør legges til i hoveddelen.
  5. Lag en vektor kalt vec for å lagre heltallsdata.
  6. Legg til elementet 0 til vektoren kalt vec.
  7. Legg til elementet 1 til vektoren kalt vec.
  8. En kommentar. Det vil bli hoppet over av C++ kompilatoren.
  9. Bruk try-setningen for å fange et unntak. { markerer begynnelsen på brødteksten til prøve/fangst-blokken. Koden som legges til i kroppen vil bli den beskyttede koden.
  10. Prøv å få tilgang til elementet som er lagret i indeks 2 (tredje element) av vektoren kalt vec. Dette elementet eksisterer ikke.
  11. Slutten av brødteksten til try/catch-blokken.
  12. Fang unntaket. Den returnerte feilmeldingen vil bli lagret i variabelen eks.
  13. Skriv ut en melding på konsollen hvis unntaket fanges opp.
  14. Enden av kroppen til fangblokken.
  15. Programmet skal returnere en verdi ved vellykket utførelse.
  16. Slutten av hoved()-funksjonens hoveddel.

Eksempel 2:

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

Utgang:

Nøkkelord for håndtering av unntak

Her er et skjermbilde av koden:

Nøkkelord for håndtering av unntak

Kodeforklaring:

  1. Inkluder iostream-headerfilen i programmet for å bruke funksjonene.
  2. Inkluder std-navneområdet i programmet til klassene uten å kalle det.
  3. Lag en funksjon kalt zeroDivision som tar to heltallsargumenter, x og y. Funksjonen skal returnere et dobbelt resultat.
  4. Bruk en if-setning for å sjekke om verdien av variabelargumentet y er 0. { markerer begynnelsen på if-kroppen.
  5. Meldingen som skal returneres/kastes hvis y er 0.
  6. Slutten av brødteksten til if-setningen.
  7. ZeroDivision-funksjonen skal returnere verdien av x/y.
  8. Slutten av brødteksten til nulldivisjonsfunksjonen.
  9. Kall opp main()-metoden. { markerer begynnelsen på denne metoden.
  10. Deklarer en heltallsvariabel og tilordne den verdien 11.
  11. Deklarer en heltallsvariabel b og tilordne den verdien 0.
  12. Erklær en dobbel variabel c og gi den verdien 0.
  13. Bruk try-setningen for å fange et unntak. { markerer begynnelsen på brødteksten til prøve/fangst-blokken. Koden som legges til i kroppen vil bli den beskyttede koden.
  14. Kalle nulldelingsfunksjonen og gå videre til argumentene a og b, det vil si 11 og 0. Resultatet av denne operasjonen vil bli lagret i variabel c.
  15. Skriv ut verdien av variabel c på konsollen.
  16. Slutten av brødteksten til try/catch-blokken.
  17. Fang unntaket. Den returnerte feilmeldingen vil bli lagret i variabelmeldingen.
  18. Skriv ut den returnerte feilmeldingen på konsollen.
  19. Enden av kroppen til fangblokken.
  20. Programmet skal returnere en verdi ved vellykket utførelse.
  21. Slutten av hoved()-funksjonens hoveddel.

C++ Standard unntak

C++ Standard unntak

C++ leveres med en liste over standard unntak definert i klasse. Disse er beskrevet nedenfor:

Unntak Tekniske beskrivelser
std::unntak Dette er et unntak og overordnet klasse av alle standard C++ unntak.
std::bad_alloc Dette unntaket er forårsaket av et nytt nøkkelord.
std::bad_cast Dette er et unntak kastet av dynamic_cast.
std::bad_exception En nyttig enhet for å håndtere uventede unntak i C++ programmer.
std::bad_typeid Et unntak kastet av typeid.
std::logic_error Dette unntaket kan teoretisk oppdages ved å lese kode.
std::domene_feil Dette er et unntak som er gjort etter bruk av et matematisk ugyldig domene.
std::ugyldig_argument Et unntak for bruk av ugyldige argumenter.
std::length_error Et unntak kastet etter å ha opprettet en stor std::streng.
std::out_of_range Kastet av metoden.
std::runtime_error Dette er et unntak som ikke kan oppdages ved å lese koden.
std::overflow_error Dette unntaket blir kastet etter at det oppstår et matematisk overløp.
std::range_error Dette unntaket blir kastet når du prøver å lagre en verdi utenfor området.
std::underflow_error Et unntak kastet etter forekomsten av matematisk underflyt.

Brukerdefinerte unntak

Ocuco C++ std::exception class lar oss definere objekter som kan kastes som unntak. Denne klassen er definert i overskrift. Klassen gir oss en virtuell medlemsfunksjon som heter hva.

Denne funksjonen returnerer en null-terminert tegnsekvens av typen char *. Vi kan overskrive det i avledede klasser for å ha en unntaksbeskrivelse.

Eksempel:

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

Utgang:

Brukerdefinerte unntak

Her er et skjermbilde av koden:

Brukerdefinerte unntak

Kodeforklaring:

  1. Inkluder iostream-headerfilen i programmet vårt. Vi vil bruke funksjonene uten å få feil.
  2. Ta med unntaksoverskriftsfilen i programmet vårt. Vi vil bruke funksjonene som hva uten feil.
  3. Inkluder std-navneområdet i programmet vårt for å bruke klassene uten å kalle det.
  4. Opprett en ny klasse kalt newException. Denne klassen arver unntaksklassen til C++.
  5. Begynnelsen av klassekroppen.
  6. Overskriv den virtuelle medlemsfunksjonen what() definert i unntaksoverskriftsfilen. Vi vil da beskrive vårt eget unntak, det nye unntaket.
  7. Start definisjonen av det nye unntaket.
  8. Meldingen som skal returneres hvis det nye unntaket fanges opp.
  9. Slutt på definisjonen av det nye unntaket.
  10. Slutten av brødteksten i klassen newException. Newex er navnet som skal brukes for å fange opp vårt nye unntak, hvoretter det nye unntaket vil bli kalt.
  11. Kalle hoved()-funksjonen. Programlogikken bør legges til i hoveddelen. { markerer begynnelsen på kroppen.
  12. Bruk en try-setning for å markere koden vi må markere unntaket innenfor. { markerer begynnelsen på brødteksten til prøve/fangst-blokken. Koden omgitt av dette vil bli beskyttet.
  13. Kast newex-unntaket hvis det blir fanget.
  14. Slutt på prøvekroppen.
  15. Bruk catch-setningen for å fange unntaket. Unntaksfeilmeldingen vil bli lagret i variabel eks.
  16. Skriv ut unntaksfeilmeldingen på konsollen.
  17. Slutten av fangstteksten.
  18. Programmet skal returnere en verdi hvis det kjøres vellykket.
  19. Slutten av hoveddelen av hoved()-funksjonen.

Sammendrag

  • Med unntakshåndtering i C++, kan du håndtere kjøretidsfeil.
  • Kjøretidsfeil er feilene som oppstår under programkjøring.
  • Unntakshåndtering hjelper deg med å håndtere eventuelle uventede omstendigheter i programmet.
  • Når den uventede omstendigheten inntreffer, overføres programkontrollen til behandlere.
  • For å fange et unntak, plasserer du en kodedel under try-catch-blokken.
  • Nøkkelordet throw hjelper programmet med å kaste unntak, og hjelper programmet med å håndtere problemet.
  • Nøkkelordet try hjelper med å identifisere kodeblokken som visse unntak vil bli aktivert for.
  • Vi kan overskrive what()-funksjonen til unntaksoverskriftsfilen for å definere unntakene våre.