C ++ Unntakshåndtering: Prøv, fangst, kast eksempel

Innholdsfortegnelse:

Anonim

Hva er unntakshåndtering i C ++?

Unntakshåndtering i C ++ gir deg en måte å håndtere uventede forhold som kjøretidsfeil på. Så når en uventet omstendighet inntreffer, overføres programkontrollen til spesialfunksjoner kjent som håndterere.

For å fange unntakene legger du en del av koden under unntakskontroll. Kodeseksjonen er plassert i forsøksblokken.

Hvis det oppstår en eksepsjonell situasjon 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 utføres normalt. Behandlerne vil bli ignorert.

I denne C ++ opplæringen vil du lære:

  • Hva er unntakshåndtering i C ++?
  • Hvorfor unntakshåndtering?
  • Nøkkelord for unntakshåndtering
  • Syntaks:
  • C ++ standard unntak
  • Brukerdefinerte unntak

Hvorfor unntakshåndtering?

Her er årsaken til bruk av Exception Handling i C ++:

  • Du vil skille feilhåndteringskoden din fra din normale kode. Koden vil være mer lesbar og lettere å 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 ikke fangede unntakene.

Nøkkelord for unntakshåndtering

Unntakshåndtering i C ++ dreier seg om disse tre nøkkelordene:

  • kast - når et program støter på et problem, kaster det et unntak. Kast-nøkkelordet hjelper programmet til å utføre kastet.
  • fange - et program bruker en unntakshåndterer for å fange et unntak. Det legges til i delen av et program der du trenger å håndtere problemet. Det gjøres ved hjelp av fangst-søkeordet.
  • prøv - prøveblokken identifiserer kodeblokken som visse unntak vil bli aktivert for. Det skal følges av en / flere fangstblokker.

Anta at en kodeblokk gir et unntak. Unntaket blir fanget av en metode som bruker søkeord for prøve og fangst. Try / catch-blokken skal omgi kode som kan gi unntak. Slike koder er kjent som beskyttet kode.

Syntaks:

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 ett forsøk, kan vi ha mange fangstuttalelser.
  • ExceptionName er navnet på unntaket som skal fanges.
  • Unntak1, unntak2 og unntakN er dine definerte navn for å henvise til unntakene.

Eksempel 1:

#include#includeusing namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}

Produksjon:

Her er et skjermbilde av koden:

Kode Forklaring:

  1. Ta med iostream header-filen i programmet for å bruke funksjonene.
  2. Inkluder vektorkopfilen i programmet for å bruke funksjonene.
  3. Inkluder std navneområdet i programmet til klassene sine uten å kalle det.
  4. Ring til hovedfunksjonen (). Programlogikken skal legges til i kroppen.
  5. Lag en vektor med navnet vec for å lagre heltallsdata.
  6. Legg elementet 0 til vektoren kalt vec.
  7. Legg element 1 til vektoren som heter vec.
  8. En kommentar. Den hoppes over av C ++ - kompilatoren.
  9. Bruk prøveerklæringen for å få et unntak. {Markerer begynnelsen på kroppen til prøve / fangstblokk. Koden som legges til i kroppen, blir den beskyttede koden.
  10. Prøv å få tilgang til elementet som er lagret i indeks 2 (tredje element) av vektoren som heter vec. Dette elementet eksisterer ikke.
  11. Slutten av kroppen til prøve / fangstblokk.
  12. Fang unntaket. Den returnerte feilmeldingen lagres i variabelen eks.
  13. Skriv ut en melding på konsollen hvis unntaket er fanget.
  14. Enden på kroppen til fangstblokken.
  15. Programmet skal returnere en verdi etter vellykket gjennomføring.
  16. Slutten av hovedfunksjonen ().

Eksempel 2:

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

Produksjon:

Her er et skjermbilde av koden:

Kode Forklaring:

  1. Ta med iostream header-filen i programmet for å bruke funksjonene.
  2. Inkluder std navneområdet i programmet til klassene sine uten å kalle det.
  3. Opprett en funksjon med navnet zeroDivision som tar to heltallargumenter, x og y. Funksjonen skal gi et dobbelt resultat.
  4. Bruk en if-setning for å sjekke om verdien til variabelt argument y er 0. {markerer begynnelsen på if-kroppen.
  5. Meldingen som skal returneres / kastes hvis y er 0.
  6. Slutten på kroppen til if-setningen.
  7. ZeroDivision-funksjonen skal returnere verdien av x / y.
  8. Slutten av kroppen til zeroDivision-funksjonen.
  9. Kall hovedmetoden (). {Markerer begynnelsen på denne metoden.
  10. Erklær en heltalsvariabel og tildel den verdien 11.
  11. Erklær en heltalsvariabel b og tildel den verdien 0.
  12. Erklær en dobbel variabel c og tildel den verdien 0.
  13. Bruk prøveerklæringen for å få et unntak. {Markerer begynnelsen på kroppen til prøve / fangstblokk. Koden som legges til i kroppen, blir den beskyttede koden.
  14. Kall funksjonen zeroDivision og overføring 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 kroppen til prøve / fangstblokk.
  17. Fang unntaket. Den returnerte feilmeldingen lagres i variabelmeldingen.
  18. Skriv ut den returnerte feilmeldingen på konsollen.
  19. Enden på kroppen til fangstblokken.
  20. Programmet skal returnere en verdi etter vellykket gjennomføring.
  21. Slutten av hovedfunksjonen ().

C ++ standard unntak

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

Unntak Beskrivelse
std :: unntak Dette er et unntak og overordnet klasse for alle standard C ++ unntak.
std :: bad_alloc Dette unntaket kommer fra et nytt nøkkelord.
std :: bad_cast Dette er et unntak fra 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 påvises ved å lese kode.
std :: domain_error Dette er et unntak som kastes etter bruk av et matematisk ugyldig domene.
std :: ugyldig_argument Et unntak kastet for å bruke ugyldige argumenter.
std :: lengdefeil Et unntak kastet etter å ha opprettet en stor std :: streng.
std :: out_of_range Kastet av ved metoden.
std :: runtime_error Dette er et unntak som ikke kan oppdages ved å lese koden.
std :: overflow_error Dette unntaket kastes etter forekomst av 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 understrømning.

Brukerdefinerte unntak

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

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

Eksempel:

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

Produksjon:

Her er et skjermbilde av koden:

Kode Forklaring:

  1. Inkluder iostream header-filen i programmet vårt. Vi vil bruke funksjonene uten å få feil.
  2. Inkluder unntaksoverskriftsfilen i programmet vårt. Vi vil bruke funksjonene som det uten feil.
  3. Inkluder std navneområdet i programmet vårt for å bruke klassene uten å kalle det.
  4. Opprett en ny klasse som heter newException. Denne klassen arver unntaksklassen C ++.
  5. Begynnelsen på klassekroppen.
  6. Overskriv den virtuelle medlemsfunksjonen hva () som er 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 blir fanget.
  9. Slutt på definisjonen av det nye unntaket.
  10. Slutten av kroppen til klassen newException. Newex er navnet som skal brukes til å fange vårt nye unntak, hvoretter newException vil bli kalt.
  11. Ring til hovedfunksjonen (). Programlogikken skal legges til i kroppen. {Markerer begynnelsen på kroppen.
  12. Bruk en prøveerklæring for å merke koden som vi trenger for å merke unntaket. {Markerer begynnelsen på kroppen til prøve / fangstblokk. Koden omgitt av dette blir beskyttet.
  13. Kast newex-unntaket hvis det er fanget.
  14. Slutten på prøvekroppen.
  15. Bruk fangstoppgaven for å fange unntaket. Unntaksfeilmeldingen lagres i variabel eks.
  16. Skriv ut unntaksfeilmeldingen på konsollen.
  17. Slutten på selve fangstoppgaven.
  18. Programmet skal returnere en verdi hvis det kjøres vellykket.
  19. Slutten av kroppen til hovedfunksjonen ().

Sammendrag:

  • Med unntakshåndtering i C ++ kan du håndtere kjøretidsfeil.
  • Runtime-feil er feilene som oppstår under programutførelsen.
  • Unntakshåndtering hjelper deg med å håndtere uventede omstendigheter i programmet ditt.
  • Når den uventede omstendigheten inntreffer, overføres programkontrollen til håndtererne.
  • For å fange et unntak plasserer du en del av koden under prøvefangstblokken.
  • Kast-nøkkelordet hjelper programmet til å kaste unntak, og hjelper programmet til å håndtere problemet.
  • Prøve-nøkkelordet hjelper deg med å identifisere kodeblokken som visse unntak vil bli aktivert for.
  • Vi kan overskrive what () -funksjonen til unntaksoverskriftsfilen for å definere unntakene våre.