C ++

Unntakshåndtering i C ++

Unntakshåndtering i C ++
Det er tre typer programvarefeil som eksisterer. Dette er syntaksfeil, logiske feil og kjøretidsfeil.

Syntaksfeil

Et feil skrevet uttrykk, utsagn eller konstruksjon er en syntaksfeil.

Tenk på følgende to utsagn:

int arr [] = 1, 2, 3; //riktig
int arr = 1, 2, 3; // syntaksfeil, mangler []

De er definisjoner av samme matrise. Den første er riktig. Den andre mangler [], og det er en syntaksfeil. Et program med en syntaksfeil lykkes ikke å kompilere. Kompileringen mislykkes med en feilmelding som indikerer syntaksfeilen. Det som er bra er at en syntaksfeil alltid kan løses hvis programmereren vet hva han gjør.

Logikkfeil

En logikkfeil er en feil begått av programmereren når det gjøres feil logisk koding. Det kan være et resultat av uvitenhet fra programmereren til programmeringsspråkfunksjonene eller en misforståelse av hva programmet skal gjøre.

I denne situasjonen er programmet satt sammen vellykket. Programmet fungerer bra, men det gir gale resultater. En slik feil kan være på grunn av at en sløyfe gjentas 5 ganger når den lages til å gjenta 10 ganger. Det kan også være at en løkke ubevisst blir gjort for å gjentas uendelig. Den eneste måten å løse denne typen feil på er å gjøre nøye programmering og teste programmet grundig før du overleverer det til kunden.

Runtime Feil

Feil eller eksepsjonell inngang forårsaker kjøretidsfeil. I dette tilfellet ble programmet vellykket og fungerer bra i mange situasjoner. I visse situasjoner krasjer (og stopper) programmet.

Tenk deg at i et programkodesegment må 8 deles med et antall nevnere. Så hvis telleren 8 er delt med nevneren 4, vil svaret (kvotient) være 2. Imidlertid, hvis brukeren legger inn 0 som nevner, vil programmet krasje. Deling av 0 er ikke tillatt i matematikk, og det er heller ikke tillatt i databehandling. Inndeling av null bør forhindres i programmering. Unntakshåndtering håndterer kjøretidsfeil, som divisjon for null. Følgende program viser hvordan du skal håndtere divisjon-ved-null-problemet uten å bruke unntaksfunksjonen i C ++:

#inkludere
bruker navneområde std;
int main ()

int teller = 8;
int nevner = 2;
hvis (nevner != 0)

int resultat = teller / nevner;
cout << result << '\n';

ellers

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

retur 0;

Utgangen er 4. Hvis nevneren var 0, ville utgangen ha vært:

“Divisjon med null er ikke tillatt!”

Hovedkoden her er en if-else-konstruksjon. Hvis nevneren ikke er 0, vil divisjonen finne sted; hvis det er 0, vil ikke delingen finne sted. En feilmelding vil bli sendt til brukeren, og programmet fortsetter å kjøre uten å krasje. Runtime-feil håndteres vanligvis ved å unngå kjøring av et kodesegment og sende en feilmelding til brukeren.

Unntaksfunksjonen i C ++ bruker en prøveblokk for if-blokken og en fangstblokk for den andre blokken for å håndtere feilen, akkurat som følger:

#inkludere
bruker navneområde std;
int main ()

int teller = 8;
int nevner = 2;
prøve

if (nevner != 0)

int resultat = teller / nevner;
cout << result << '\n';

ellers

kaste 0;


fange (int err)

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

retur 0;

Merk at prøveoverskriften ikke har noe argument. Vær også oppmerksom på at fangstblokken, som er som en funksjonsdefinisjon, har en parameter. Parametertypen må være den samme som operand (argument) til kasteuttrykket. Kasteuttrykket er i prøveblokken. Det kaster et argument av programmererens valg som er relatert til feilen, og fangstblokken fanger den. På den måten blir ikke koden i prøveblokken utført. Deretter viser fangstblokken feilmeldingen.

Denne artikkelen forklarer håndtering av unntak i C++. Grunnleggende kunnskap i C ++ er en forutsetning for at leseren skal forstå denne artikkelen.

Artikkelinnhold:

  • Funksjon som kaster et unntak
  • Mer enn én fangstblokk for en prøveblokk
  • Nestet prøve / fange blokker
  • noexcept-specifier
  • Special std :: terminate () -funksjonen
  • Konklusjon

Funksjon som kaster et unntak:

En funksjon kan også kaste et unntak akkurat som prøveblokken gjør. Kastingen foregår innenfor definisjonen av funksjonen. Følgende program illustrerer dette:

#inkludere
bruker navneområde std;
ugyldig fn (const char * str)

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

int main ()

prøve

fn ("smith");

fange (char ch)

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

retur 0;

Legg merke til at denne gangen har prøveblokken bare funksjonsanropet. Det er funksjonen kalt som har kastoperasjonen. Fangsblokken fanger unntaket, og resultatet er:

“Personens navn kan ikke begynne med små bokstaver!”

Denne gangen er typen kastet og fanget røye.

Mer enn én fangstblokk for en prøveblokk:

Det kan være mer enn en fangstblokk for en prøveblokk. Tenk deg situasjonen der en inngang kan være hvilken som helst av tegnene på tastaturet, men ikke et siffer og ikke et alfabet. I dette tilfellet må det være to fangstblokker: en for et heltall for å sjekke sifferet og en for en røye for å sjekke alfabetet. Følgende kode illustrerer dette:

#inkludere
bruker navneområde std;
char input = '*';
int main ()

prøve

hvis (isdigit (input))
kaste 10;
hvis (isalpha (input))
kaste 'z';

fange (int)

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

fangst (røye)

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

retur 0;

Det er ingen utdata. Hvis verdien av inndata var et siffer, e.g., '1', ville utgangen ha vært:

"Sifferinngang er forbudt!"

Hvis verdien av inndata var et alfabet, e.g., 'a', ville utgangen ha vært:

"Inntasting av tegn er forbudt!"

Merk at det ikke er noe identifikatornavn i parameterlisten til de to fangstblokkene. Vær også oppmerksom på at i definisjonen av de to fangstblokkene, har de spesielle argumentene som kastes ikke blitt bekreftet om verdiene deres er nøyaktige eller ikke.

Det som betyr noe for en fangst er typen; en fangst må samsvare med typen operand som kastes. Den spesielle verdien av argumentet (operand) som kastes, kan brukes til videre bekreftelse om nødvendig.

Mer enn én håndterer for samme type

Det er mulig å ha to håndtere av samme type. Når et unntak kastes, overføres kontrollen til nærmeste handler med en matchende type. Følgende program illustrerer dette:

#inkludere
bruker navneområde std;
char input = '1';
int main ()

prøve

hvis (isdigit (input))
kaste 10;

fange (int)

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

fange (int)

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

retur 0;

Utgangen er:

"Sifferinngang er forbudt!"

Nestet prøve / fang blokker:

prøve / fange blokker kan være nestet. Ovennevnte program for inntasting av ikke-alfanumeriske tegn fra tastaturet gjentas her, men med den alfabetiske feilkoden nestet:

#inkludere
bruker navneområde std;
char input = '*';
int main ()

prøve

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

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

fangst (røye)

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


fange (int)

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

retur 0;

Feilen alfabetisk prøve / fangstblokk er nestet i prøveblokken til sifferkoden. Driften av dette programmet og den forrige operasjonen som det er kopiert fra, er den samme.

noexcept-specifier

Tenk på følgende funksjon:

void fn (const char * str) noexcept

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

Legg merke til spesifikatoren 'noexcept' like etter høyre parentes i funksjonsparameterlisten. Dette betyr at funksjonen ikke skal kaste et unntak. Hvis funksjonen gir et unntak, som i dette tilfellet, vil den kompilere med en advarsel, men vil ikke kjøre. Et forsøk på å kjøre programmet vil kalle spesialfunksjonen std :: terminate (), som skal stoppe programmet elegant i stedet for bare å la det bokstavelig talt krasje.

Noexcept-spesifikatoren er i forskjellige former. Disse er som følger:

skriv func () noexcept; : tillater ikke et kastuttrykk
skriv func () noexcept (true); : tillater et kastuttrykk
skriv func () throw (); : tillater ikke et kastuttrykk
skriv func () noexcept (false); : tillater et kastuttrykk, som er valgfritt
skriv func (); : tillater et kastuttrykk, som er valgfritt

sant eller usant i parentes kan erstattes av et uttrykk som resulterer i sant eller usant.

The Special std :: terminate () -funksjonen:

Hvis et unntak ikke kan håndteres, bør det kastes på nytt. I dette tilfellet kan det kastede uttrykket ha eller ikke ha en operand. Spesialfunksjonen std :: terminate () vil bli kalt ved kjøretid, noe som skal stoppe programmet elegant i stedet for bare å la det bokstavelig talt krasje.

Skriv inn, kompilér og kjør følgende program:

#inkludere
bruker navneområde std;
char input = '1';
int main ()

prøve

hvis (isdigit (input))
kaste 10;

fange (int)

kaste;

retur 0;

Etter en vellykket samling ble programmet avsluttet uten å kjøre, og feilmeldingen fra forfatterens datamaskin er:

“Avslutte kalt etter å ha kastet en forekomst av 'int'

Avbrutt (kjernedumpet) ”

Konklusjon:

Unntaksfunksjonen i C ++ forhindrer at et kodesegment kjøres basert på en slags inngang. Programmet fortsetter å kjøres etter behov. Unntaket (feilforebygging) består av en prøveblokk og en fangstblokk. Try-blokken har kodesegmentet av interesse, som kan omgåes, avhengig av noen inngangsbetingelser. Try-blokken har kasteuttrykket, som kaster en operand. Denne operanden kalles også unntaket. Hvis operand-typen og typen for parameteren til fangstblokken er den samme, blir unntaket fanget (håndtert). Hvis unntaket ikke blir fanget opp, vil programmet avsluttes, men likevel være trygt siden kodesegmentet som skulle utføres for å gi feil resultat ikke er utført. Typisk unntakshåndtering betyr å omgå kodesegmentet og sende en feilmelding til brukeren. Kodesegmentet utføres for normal inngang, men forbigås for feil innganger.

Mus Hvordan endre mus og berøringsplateinnstillinger ved hjelp av Xinput i Linux
Hvordan endre mus og berøringsplateinnstillinger ved hjelp av Xinput i Linux
De fleste Linux-distribusjoner leveres med "libinput" -biblioteket som standard for å håndtere inngangshendelser på et system. Den kan behandle inngan...
Mus Kartlegg museknappene på en annen måte for annen programvare med X-Mouse Button Control
Kartlegg museknappene på en annen måte for annen programvare med X-Mouse Button Control
Kanskje du trenger et verktøy som kan gjøre at musens kontroll endres med hvert program du bruker. Hvis dette er tilfelle, kan du prøve et program som...
Mus Microsoft Sculpt Touch Wireless Mouse Review
Microsoft Sculpt Touch Wireless Mouse Review
Jeg har nylig lest om Microsoft Sculpt Touch trådløs mus og bestemte meg for å kjøpe den. Etter å ha brukt den en stund bestemte jeg meg for å dele mi...