C ++

Undtagelseshåndtering i C ++

Undtagelseshåndtering i C ++
Der findes tre typer softwarefejl. Disse er syntaksfejl, logiske fejl og kørselsfejl.

Syntaksfejl

Et forkert indtastet udtryk, udsagn eller konstruktion er en syntaksfejl.

Overvej følgende to udsagn:

int arr [] = 1, 2, 3; //korrekt
int arr = 1, 2, 3; // syntaksfejl, mangler []

De er definitioner af det samme array. Den første er korrekt. Den anden mangler [], og det er en syntaksfejl. Et program med en syntaksfejl lykkes ikke at kompilere. Kompileringen mislykkes med en fejlmeddelelse, der angiver syntaksfejlen. En god ting er, at en syntaksfejl altid kan løses, hvis programmøren ved, hvad han laver.

Logisk fejl

En logisk fejl er en fejl begået af programmøren, når der foretages en forkert logisk kodning. Det kan være et resultat af uvidenhed fra programmøren til programmeringssprogets funktioner eller en misforståelse af, hvad programmet skal gøre.

I denne situation kompileres programmet med succes. Programmet fungerer fint, men det giver forkerte resultater. En sådan fejl kan skyldes, at en sløjfe gentages 5 gange, når den er lavet til at gentage 10 gange. Det kan også være, at en løkke ubevidst er lavet til at gentage det uendeligt. Den eneste måde at løse denne slags fejl på er at foretage omhyggelig programmering og teste programmet grundigt, inden det overdrages til kunden.

Kørselsfejl

Forkerte eller usædvanlige input forårsager runtime-fejl. I dette tilfælde blev programmet udarbejdet med succes og fungerer godt i mange situationer. I visse situationer går programmet ned (og stopper).

Forestil dig, at 8 i et programkodesegment skal divideres med et antal nævnere. Så hvis tælleren 8 divideres med nævneren 4, ville svaret (kvotient) være 2. Men hvis brugeren indtaster 0 som nævneren, vil programmet gå ned. Division med 0 er ikke tilladt i matematik, og det er heller ikke tilladt i computing. Division-by-zero bør forhindres i programmeringen. Undtagelseshåndtering håndterer kørselsfejl, som division-af-nul. Følgende program viser, hvordan man håndterer problemet med division efter nul uden at bruge undtagelsesfunktionen i C ++:

#omfatte
ved hjælp af namespace std;
int main ()

int-tæller = 8;
int-nævneren = 2;
hvis (nævneren != 0)

int resultat = tæller / nævneren;
cout << result << '\n';

andet

cout << "Division by zero is not permitted!" << '\n';

returnere 0;

Outputtet er 4. Hvis nævneren var 0, ville output have været:

”Opdeling med nul er ikke tilladt!”

Hovedkoden her er en if-else-konstruktion. Hvis nævneren ikke er 0, finder opdelingen sted; hvis det er 0, finder opdelingen ikke sted. En fejlmeddelelse sendes til brugeren, og programmet kører fortsat uden at gå ned. Kørselsfejl håndteres normalt ved at undgå udførelsen af ​​et kodesegment og sende en fejlmeddelelse til brugeren.

Undtagelsesfunktionen i C ++ bruger en prøveblok til if-blokken og en fangstblok til den anden blok til at håndtere fejlen, som følger:

#omfatte
ved hjælp af namespace std;
int main ()

int-tæller = 8;
int-nævneren = 2;
prøve

hvis (nævneren != 0)

int resultat = tæller / nævneren;
cout << result << '\n';

andet

kaste 0;


fange (fejlagtigt)

hvis (err == 0)
cout << "Division by zero is not permitted!" << '\n';

returnere 0;

Bemærk, at prøveoverskriften ikke har et argument. Bemærk også, at fangstblokken, som er som en funktionsdefinition, har en parameter. Parametertypen skal være den samme som operand (argument) for kasteudtrykket. Kasteudtrykket er i prøveblokken. Det kaster et argument af programmørens valg, der er relateret til fejlen, og fangstblokken fanger det. På den måde udføres koden i prøveblokken ikke. Derefter viser fangstblokken fejlmeddelelsen.

Denne artikel forklarer håndtering af undtagelser i C++. Grundlæggende viden i C ++ er en forudsætning for, at læseren kan forstå denne artikel.

Artikelindhold:

  • Funktion, der kaster en undtagelse
  • Mere end en Catch-Blocks til One Try-block
  • Indlejrede forsøg / fang blokke
  • noexcept-specifier
  • Funktionen Special std :: terminate ()
  • Konklusion

Funktion, der kaster en undtagelse:

En funktion kan også kaste en undtagelse ligesom hvad prøveblokken gør. Kastingen finder sted inden for definitionen af ​​funktionen. Følgende program illustrerer dette:

#omfatte
ved hjælp af namespace std;
ugyldigt fn (const char * str)

hvis (islower (str [0]))
smide 'l';

int main ()

prøve

fn ("smed");

fange (char ch)

hvis (ch == 'l')
cout << "Person's name cannot begin in lowercase!" << '\n';

returnere 0;

Bemærk, at denne gang har prøveblokken kun funktionsopkaldet. Det er den kaldte funktion, der har kastoperationen. Fangsblokken fanger undtagelsen, og output er:

”Personens navn kan ikke begynde med små bogstaver!”

Denne gang er den type, der kastes og fanges, en røye.

Mere end en fangstblok til en prøveblok:

Der kan være mere end en fangstblok for en prøveblok. Forestil dig situationen, hvor et input kan være et hvilket som helst af tastaturets tegn, men ikke et ciffer og ikke et alfabet. I dette tilfælde skal der være to fangblokke: en for et heltal for at kontrollere cifret og en for en tegn for at kontrollere alfabetet. Følgende kode illustrerer dette:

#omfatte
ved hjælp af namespace std;
char input = '*';
int main ()

prøve

hvis (isdigit (input))
kast 10;
hvis (isalpha (input))
smide 'z';

fange (int)

cout << "Digit input is forbidden!" << '\n';

fangst (char)

cout << "Character input is forbidden!" << '\n';

returnere 0;

Der er ingen output. Hvis værdien af ​​input var et ciffer, f.eks.g., '1', output ville have været:

"Indtastning af cifre er forbudt!"

Hvis værdien af ​​input var et alfabet, f.eks.g., 'a', output ville have været:

"Indtastning af tegn er forbudt!"

Bemærk, at der i parameterlisten over de to fangblokke ikke er noget identifikationsnavn. Bemærk også, at de definerede argumenter i definitionen af ​​de to fangblokke ikke er blevet verificeret, om deres værdier er nøjagtige eller ej.

Det, der betyder noget for en fangst, er typen; en fangst skal matche den type operand, der kastes. Den særlige værdi af det kastede argument (operand) kan bruges til yderligere verifikation, hvis det er nødvendigt.

Mere end en håndterer til samme type

Det er muligt at have to håndtere af samme type. Når en undtagelse kastes, overføres kontrol til den nærmeste handler med en matchende type. Følgende program illustrerer dette:

#omfatte
ved hjælp af namespace std;
char input = '1';
int main ()

prøve

hvis (isdigit (input))
kast 10;

fange (int)

cout << "Digit input is forbidden!" << '\n';

fange (int)

cout << "Not allowed at all: digit input!" << '\n';

returnere 0;

Outputtet er:

"Indtastning af cifre er forbudt!"

Indlejret prøve / fang blokke:

forsøg / fangstblokke kan være indlejrede. Ovenstående program til indtastning af ikke-alfanumeriske tegn fra tastaturet gentages her, men med den alfabetiske fejlkode indlejret:

#omfatte
ved hjælp af namespace std;
char input = '*';
int main ()

prøve

hvis (isdigit (input))
kast 10;
prøve

hvis (isalpha (input))
smide 'z';

fangst (char)

cout << "Character input is forbidden!" << '\n';


fange (int)

cout << "Digit input is forbidden!" << '\n';

returnere 0;

Fejlen alfabetisk prøve / fangst-blok er indlejret i prøveblokken for den cifrede kode. Driften af ​​dette program og den forrige handling, hvorfra det kopieres, er den samme.

noexcept-specifier

Overvej følgende funktion:

ugyldigt fn (const char * str) noexcept

hvis (islower (str [0]))
smide 'l';

Bemærk specifikationen 'noexcept' lige efter højre parentes på funktionsparameterlisten. Dette betyder, at funktionen ikke skal kaste en undtagelse. Hvis funktionen kaster en undtagelse, som i dette tilfælde, kompileres den med en advarselsmeddelelse, men kører ikke. Et forsøg på at køre programmet kalder den specielle funktion std :: terminate (), som skal stoppe programmet yndefuldt i stedet for bare at lade det bogstaveligt talt gå ned.

Noexcept-specifikatoren findes i forskellige former. Disse er som følger:

skriv func () noexcept; : tillader ikke et kast-udtryk
skriv func () noexcept (true); : tillader et kasteudtryk
skriv func () throw (); : tillader ikke et kast-udtryk
skriv func () noexcept (false); : tillader et kasteudtryk, som er valgfrit
skriv func (); : tillader et kasteudtryk, som er valgfrit

sand eller falsk i parentes kan erstattes af et udtryk, der resulterer i sand eller falsk.

Funktionen Special std :: terminate ():

Hvis en undtagelse ikke kan håndteres, skal den kastes igen. I dette tilfælde kan det kastede udtryk muligvis ikke have en operand. Den specielle funktion std :: terminate () kaldes ved kørselstid, hvilket skal stoppe programmet yndefuldt i stedet for bare at lade det gå ned bogstaveligt.

Skriv, kompilér og kør følgende program:

#omfatte
ved hjælp af namespace std;
char input = '1';
int main ()

prøve

hvis (isdigit (input))
kast 10;

fange (int)

kaste;

returnere 0;

Efter en vellykket kompilering afsluttes programmet uden at køre, og fejlmeddelelsen fra forfatterens computer er:

“Afslut kaldet efter at have kastet en forekomst af 'int'

Afbrudt (kernedumpet) ”

Konklusion:

Undtagelsesfunktionen i C ++ forhindrer et kodesegment i at udføre baseret på en slags input. Programmet fortsætter med at udføre efter behov. Undtagelsen (fejlforebyggelse) konstruktion består af en prøve-blok og en fang-blok. Try-blokken har kodesegmentet af interesse, som kan omgåes afhængigt af en eller anden inputtilstand. Try-blokken har kasteudtrykket, som kaster en operand. Denne operand kaldes også undtagelsen. Hvis operand-typen og typen for parameteren for fangstblokken er den samme, fanges undtagelsen (håndteres). Hvis undtagelsen ikke er fanget, afsluttes programmet, men det skal stadig være sikkert, da kodesegmentet, der skulle udføres for at give det forkerte resultat, ikke er udført. Typisk håndtering af undtagelser betyder at omgå kodesegmentet og sende en fejlmeddelelse til brugeren. Kodesegmentet udføres for normal input, men omgået for forkerte input.

Mus Markøren hopper eller bevæger sig tilfældigt, mens han skriver i Windows 10
Markøren hopper eller bevæger sig tilfældigt, mens han skriver i Windows 10
Hvis du finder ud af, at din musemarkør hopper eller bevæger sig alene, automatisk tilfældigt, mens du skriver Windows-bærbar computer eller computer,...
Mus Sådan vender du musens og touchpadsens rulle retning i Windows 10
Sådan vender du musens og touchpadsens rulle retning i Windows 10
Mus og Touchpads gør ikke kun computing let, men mere effektiv og mindre tidskrævende. Vi kan ikke forestille os et liv uden disse enheder, men det er...
Mus Sådan ændres musemarkør og markørstørrelse, farve og skema på Windows 10
Sådan ændres musemarkør og markørstørrelse, farve og skema på Windows 10
Musemarkøren og markøren i Windows 10 er meget vigtige aspekter af operativsystemet. Dette kan også siges om andre operativsystemer, så i sandhed er d...