C++ Undtagelseshåndtering: Prøv, fang, kast Eksempel
Hvad er undtagelseshåndtering i C++?
Undtagelseshåndtering i C++ giver dig en måde at håndtere uventede omstændigheder som runtime fejl. Så hver gang en uventet omstændighed opstår, overføres programstyringen til specielle funktioner kendt som handlere.
For at fange undtagelserne placerer du en del af koden under undtagelsesinspektion. Kodesektionen er placeret i try-catch-blokken.
Hvis der opstår en usædvanlig situation inden for denne kodesektion, vil der blive givet en undtagelse. Dernæst vil undtagelsesbehandleren overtage kontrollen over programmet.
I tilfælde af at der ikke opstår en usædvanlig omstændighed, vil koden køre normalt. Behandlerne vil blive ignoreret.
I denne C++ tutorial, vil du lære:
Hvorfor undtagelseshåndtering?
Her er grunden til at bruge Exception Handling i C++:
- Du vil adskille din fejlhåndteringskode fra din normale kode. Koden bliver mere læsbar og nemmere at vedligeholde.
- Funktioner kan håndtere de undtagelser, de vælger. Selvom en funktion kaster mange undtagelser, vil den kun håndtere nogle. Den, der ringer, vil håndtere de ufangede undtagelser.
Nøgleord til håndtering af undtagelser
Undtagelseshåndtering i C++ drejer sig om disse tre nøgleord:
- kaste– når et program støder på et problem, giver det en undtagelse. Kast nøgleordet hjælper programmet med at udføre kastet.
- fangst– et program bruger en undtagelsesbehandler til at fange en undtagelse. Det føjes til den del af et program, hvor du skal håndtere problemet. Det gøres ved at bruge søgeordet catch.
- prøv– prøveblokken identificerer den kodeblok, for hvilken visse undtagelser vil blive aktiveret. Den skal efterfølges af en/flere fangblokke.
Antag, at en kodeblok vil rejse en undtagelse. Undtagelsen vil blive fanget af en metode, der bruger try and catch søgeord. Prøv/fang-blokken skal omgive kode, der kan give en undtagelse. En sådan kode er kendt som beskyttet kode.
Syntaks
Try/catch tager denne syntaks:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Selvom vi har en prøvesætning, kan vi have mange catch-sætninger.
- ExceptionName er navnet på den undtagelse, der skal fanges.
- Undtagelse1, undtagelse2 og undtagelseN er dine definerede navne for at henvise til undtagelserne.
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; }
Output:
Her er et skærmbillede af koden:
Kodeforklaring:
- Inkluder iostream-headerfilen i programmet for at bruge dens funktioner.
- Inkluder vektorheader-filen i programmet for at bruge dets funktioner.
- Inkluder std-navneområdet i programmet til dets klasser uden at kalde det.
- Kald funktionen main(). Programlogikken skal tilføjes i dens krop.
- Opret en vektor ved navn vec for at gemme heltalsdata.
- Tilføj elementet 0 til vektoren kaldet vec.
- Tilføj elementet 1 til vektoren kaldet vec.
- En kommentar. Det vil blive sprunget over af C++ compiler.
- Brug try-sætningen til at fange en undtagelse. { markerer begyndelsen af brødteksten i try/catch-blokken. Koden tilføjet i brødteksten bliver den beskyttede kode.
- Prøv at få adgang til elementet, der er gemt ved indeks 2 (tredje element) af vektoren ved navn vec. Dette element eksisterer ikke.
- Slutningen af brødteksten af try/catch-blokken.
- Fang undtagelsen. Den returnerede fejlmeddelelse vil blive gemt i variablen f.eks.
- Udskriv en besked på konsollen, hvis undtagelsen er fanget.
- Enden af fangblokkens krop.
- Programmet bør returnere en værdi ved vellykket udførelse.
- Slutningen af hoved() funktionsteksten.
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; }
Output:
Her er et skærmbillede af koden:
Kodeforklaring:
- Inkluder iostream-headerfilen i programmet for at bruge dets funktioner.
- Inkluder std-navneområdet i programmet til dets klasser uden at kalde det.
- Opret en funktion med navnet zeroDivision, der tager to heltalsargumenter, x og y. Funktionen skulle returnere et dobbelt resultat.
- Brug en if-sætning til at kontrollere, om værdien af variabelargumentet y er 0. { markerer begyndelsen af if-legemet.
- Beskeden, der skal returneres/smides, hvis y er 0.
- Slutningen af brødteksten i if-erklæringen.
- ZeroDivision-funktionen skal returnere værdien af x/y.
- Slut på brødteksten af funktionen zeroDivision.
- Kald main() metoden. { markerer begyndelsen af denne metode.
- Deklarer en heltalsvariabel og tildel den værdien 11.
- Erklær en heltalsvariabel b og tildel den værdien 0.
- Erklær en dobbelt variabel c og tildel den værdien 0.
- Brug try-sætningen til at fange en undtagelse. { markerer begyndelsen af brødteksten i try/catch-blokken. Koden tilføjet i brødteksten bliver den beskyttede kode.
- Kald nulopdelingsfunktionen og gå videre til argumenterne a og b, det vil sige 11 og 0. Resultatet af denne operation vil blive gemt i variabel c.
- Udskriv værdien af variabel c på konsollen.
- Slutningen af brødteksten af try/catch-blokken.
- Fang undtagelsen. Den returnerede fejlmeddelelse vil blive gemt i den variable meddelelse.
- Udskriv den returnerede fejlmeddelelse på konsollen.
- Enden af fangblokkens krop.
- Programmet bør returnere en værdi ved vellykket udførelse.
- Slutningen af hoved() funktionsteksten.
C++ Standard undtagelser
C++ leveres med en liste over standard undtagelser defineret i klasse. Disse er beskrevet nedenfor:
undtagelse | Description |
---|---|
std::undtagelse | Dette er en undtagelse og overordnet klasse af alle standard C++ undtagelser. |
std::bad_alloc | Denne undtagelse er smidt af et nyt søgeord. |
std::bad_cast | Dette er en undtagelse kastet af dynamic_cast. |
std::dårlig_undtagelse | En nyttig enhed til at håndtere uventede undtagelser i C++ programmer. |
std::bad_typeid | En undtagelse kastet af typeid. |
std::logic_error | Denne undtagelse kan teoretisk detekteres ved at læse kode. |
std::domæne_fejl | Dette er en undtagelse, der er smidt efter brug af et matematisk ugyldigt domæne. |
std::ugyldigt_argument | En undtagelse for at bruge ugyldige argumenter. |
std::længde_fejl | En undtagelse kastet efter oprettelse af en stor std::streng. |
std::out_of_range | Kastet af ved metode. |
std::runtime_error | Dette er en undtagelse, som ikke kan opdages ved at læse koden. |
std::overflow_error | Denne undtagelse er smidt efter forekomsten af et matematisk overløb. |
std::range_error | Denne undtagelse opstår, når du forsøger at gemme en værdi uden for området. |
std::underflow_error | En undtagelse kastet efter forekomsten af matematisk underløb. |
Brugerdefinerede undtagelser
C++ std::exception class giver os mulighed for at definere objekter, der kan kastes som undtagelser. Denne klasse er blevet defineret i overskrift. Klassen giver os en virtuel medlemsfunktion ved navn hvad.
Denne funktion returnerer en null-termineret tegnsekvens af typen char *. Vi kan overskrive det i afledte klasser for at få en undtagelsesbeskrivelse.
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; }
Output:
Her er et skærmbillede af koden:
Kodeforklaring:
- Inkluder iostream-header-filen i vores program. Vi vil bruge dens funktioner uden at få fejl.
- Inkluder undtagelseshovedfilen i vores program. Vi vil bruge dens funktioner som hvad uden fejl.
- Inkluder std-navneområdet i vores program for at bruge dets klasser uden at kalde det.
- Opret en ny klasse med navnet newException. Denne klasse arver undtagelsesklassen af C++.
- Begyndelsen af klassens krop.
- Overskriv den virtuelle medlemsfunktion what() defineret i undtagelsesheader-filen. Vi vil derefter beskrive vores egen undtagelse, den nye undtagelse.
- Start definitionen af den nye undtagelse.
- Den besked, der skal returneres, hvis den nye undtagelse fanges.
- Slut på definitionen af den nye undtagelse.
- Slutningen af brødteksten i klassen newException. The newex er navnet, der skal bruges til at fange vores nye undtagelse, hvorefter den newException vil blive kaldt.
- Kald funktionen main(). Programlogikken skal tilføjes i dens krop. { markerer begyndelsen af dens krop.
- Brug en try-sætning til at markere koden, inden for hvilken vi skal markere undtagelsen. { markerer begyndelsen af brødteksten i try/catch-blokken. Koden omgivet af dette vil blive beskyttet.
- Smid newex-undtagelsen, hvis den bliver fanget.
- Slut på prøvekroppen.
- Brug catch-sætningen til at fange undtagelsen. Undtagelsesfejlmeddelelsen vil blive gemt i variabel ex.
- Udskriv undtagelsesfejlmeddelelsen på konsollen.
- Slutningen af fangstteksten.
- Programmet bør returnere en værdi, hvis det udføres med succes.
- Slutningen af hoveddelen af funktionen main().
Resumé
- Med undtagelseshåndtering i C++, kan du håndtere runtime fejl.
- Kørselsfejl er de fejl, der opstår under programafvikling.
- Undtagelseshåndtering hjælper dig med at håndtere eventuelle uventede omstændigheder i dit program.
- Når den uventede omstændighed indtræffer, overføres programstyringen til behandlere.
- For at fange en undtagelse placerer du en kodesektion under try-catch-blokken.
- Nøgleordet throw hjælper programmet med at kaste undtagelser, hvilket hjælper programmet med at håndtere problemet.
- Nøgleordet try hjælper med at identificere den kodeblok, for hvilken visse undtagelser vil blive aktiveret.
- Vi kan overskrive what()-funktionen i undtagelsesheader-filen for at definere vores undtagelser.