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

⚡ Smart oppsummering

Unntakshåndtering i C++ lar et program oppdage og reagere på kjøretidsfeil ved hjelp av try, catch og throw, slik at det ikke krasjer. Her lærer du nøkkelordene, syntaksen, standardunntakene og brukerdefinerte unntak med eksempler.

  • ⚠️ Hva det er: Unntakshåndtering fanger opp kjøretidsfeil slik at et program kan gjenopprette.
  • 🔑 nøkkelord: Den bruker «try» for å teste kode, «throw» for å raise og «catch» for å håndtere feil.
  • 🧾 Syntaks: Sett risikabel kode i en try-blokk og håndter feil i catch-blokker.
  • 📚 Standard unntak: C++ gir innebygde unntak i unntakshodet.
  • 🤖 AI-hjelp: AI-verktøy som GitHub Copilot legger til try-catch-blokker og feilhåndtering.

C++ Avvikshåndtering

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

Code Forklaring:

  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

Code Forklaring:

  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

Code Forklaring:

  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.

Spørsmål og svar

Unntakshåndtering er en måte å oppdage og reagere på kjøretidsfeil i C++ ved å bruke nøkkelordene try, throw og catch, slik at programmet kan gjenopprette seg i stedet for å krasje.

C++ bruker tre nøkkelord: try pakker inn kode som kan mislykkes, throw hever et unntak når en feil oppstår, og catch håndterer det kastede unntaket.

Plasser risikabel kode i en try-blokk, og følg den deretter opp med én eller flere catch-blokker som hver håndterer en spesifikk unntakstype som kastes fra try-blokken.

Standardunntak er innebygde unntaksklasser i unntakshodet, for eksempel std::bad_alloc og std::out_of_range, som rapporterer vanlige kjøretidsfeil.

Et brukerdefinert unntak er en tilpasset klasse, ofte avledet fra std::exception, som overstyrer what()-funksjonen for å beskrive din egen spesifikke feiltilstand.

AI-assistenter som GitHub Copilot pakker risikabel kode inn i try-catch-blokker, genererer tilpassede unntaksklasser og foreslår hvilke unntak som skal fanges opp mens du skriver.

Ja. AI-drevne verktøy oppdager ubehandlede unntak, foreslår spesifikke fangstblokker fremfor generiske, og legger til meningsfulle feilmeldinger, noe som gjør din C++ koden mer robust.

`throw` genererer et unntak når en feil oppdages, mens `catch` mottar unntaket og kjører koden som håndterer eller rapporterer feilen.

Oppsummer dette innlegget med: