C og C + + programmering Resources

Del / bokmerker
Custom Search

Advance Unntak håndtering

Skrevet den 10 september 2008

Et unntak signaler vanligvis en feil. Trodde det indikerer ikke alltid en eror, kan det også signal noe som er spesielt uvanlig selv i ditt program som fortjener spesiell oppmerksomhet.

Unntak og feil håndtering

Ingen mater hvor godt programmet vårt er, det må alltid være i stand til å håndtere mulige feil. De fleste programmer i dag inneholder noen form for feilbehandling. Dessverre, nivået og kvaliteten på feilbehandling varierer sterkt. Noen programmer gir så mye feil håndtering som programmet stadig øker alarmer, selv om brukeren gir riktig input. Andre programmer gir feilhåndtering at bare en utvikler kunne loveâ € "meldingene er fulle av sjargong og dataene er nyttig bare hvis du har utformet programmet. Fortsatt andre programmer gir en størrelse passer alle feil håndtering som bare forteller brukeren en feil oppstod uten å si hva feilen det var eller hvordan å løse det.

Unntak håndtering

En av de viktigste funksjonene i C + + er unntaket håndtering, som er en bedre måte å tenke på og håndtering av feil. Med unntak håndtering gjelder følgende:

  1. Feil-håndtering kode er ikke nær så kjedelig å skrive, og det ikke blir blandet opp med "normal" code. Du skriver koden du vil skal skje, senere i en egen del du skriver koden til å takle problemene. Hvis du gjør flere anrop til en funksjon, tar du hånd om feilene fra den funksjonen en gang, på ett sted.
  2. Feil kan ikke ignoreres. Hvis en funksjon må sende en feilmelding til den som ringer av denne funksjonen,? Det kaster? et objekt som representerer denne feilen ut av funksjon. Hvis den som ringer spiller? T? Fangst? feilen og håndtere det, går det til neste tilhørende dynamiske omfang, og så videre inntil feilen er enten fast eller er programmet avsluttes fordi det ikke var behandleren å fange denne typen unntak.

Denne artikkelen tar for C? S tilnærming til feilhåndtering (som den er) diskuterer hvorfor det ikke fungerte bra for C, og forklarer hvorfor den vant? Ikke fungere i det hele for C + +. Dette kapitlet dekker også prøve, kast, og fangst, C + + søkeord som støtter unntak håndtering.

Feil håndtering i C

I de fleste av eksemplene i disse volumene, bruker vi hevde () som det var ment: for feilsøking under utvikling med kode som kan deaktiveres med # define NDEBUG for frakten produktet. Runtime feilkontroll bruker require.h funksjonene (forsikre () og krever ()) utviklet i kapittel 9 i Volume 1. Disse funksjonene er en praktisk måte å si,? There? Sa problemet her? Ll sannsynligvis ønske å håndtere med litt mer sofistikerte kode, men du skjønner? Trenger ikke å bli forstyrret av det i dette eksemplet.? Den require.h funksjonene kan være nok for små programmer, men for komplisert produktene du kanskje trenger å skrive mer avanserte feil-håndtering koden.

Feil håndtering er ganske rett fram i situasjoner der du vet nøyaktig hva du skal gjøre fordi du har all nødvendig informasjon i denne sammenheng. Selvfølgelig, du bare håndtere feilen på det tidspunktet.

Problemet oppstår når du ikke? Ikke har nok informasjon i denne sammenhengen, og du trenger å gi feil informasjon i en annen sammenheng hvor denne informasjonen finnes. I C, kan du håndtere denne situasjonen ved hjelp av tre tilnærminger:

  1. Tilbake feil informasjon fra funksjonen eller, dersom avkastningen verdien ikke kan brukes på denne måten, setter en global feilen flagg. (Standard C gir Feilkode og perror () for å støtte dette.) Som nevnt tidligere, er programmerer sannsynligvis ignorere feilen informasjon fordi kjedelig og obfuscating feilkontroll må skje med hver funksjon samtale. I tillegg kom fra en funksjon som treffer en utmerket tilstand kanskje ikke gir mening.
  2. Bruk lite kjente Standard C-bibliotek signal-håndtering system, implementert med signalet ()-funksjonen (for å finne ut hva som skjer når hendelsen oppstår) og raise () (for å generere en hendelse). Igjen, innebærer denne tilnærmingen høy kopling fordi den krever at brukeren av biblioteket som genererer signaler for å forstå og installere riktig signal-håndtering mekanismen, også i store prosjekter signalet tallene fra forskjellige biblioteker kan konflikt.
  3. Bruk nonlocal goto funksjonene i Standard C biblioteket: setjmp () og longjmp (). Med setjmp () du lagrer en kjent, fungerende i programmet, og hvis du får problemer, longjmp () vil gjenopprette staten. Igjen, det er høy kopling mellom stedet der staten er lagret og stedet der feilen oppstår.

Når de vurderer feil-håndtering ordninger med C + +, der? Er en annen veldig kritisk problem: Den C teknikker av signaler og setjmp () / longjmp () ikke ring destructors, så objekter virker ikke skikkelig rengjort opp. (Faktisk, hvis longjmp () hopper forbi enden av et omfang der destructors bør kalles, virkemåten til programmet er udefinerte.) Dette gjør det praktisk talt umulig å effektivt komme seg av en utmerket tilstand fordi du? Ll alltid forlate objekter bak som fristed? ikke ryddet opp, og som ikke lenger får tilgang. Følgende eksempel viser dette med setjmp / longjmp:

 / / Setjmp () & longjmp () # include <iostream> # include <csetjmp> bruker namespace std; class Rainbow (public: Rainbow () (cout <<"Rainbow ()" <<endl;) ~ Rainbow () ( cout <<"~ Rainbow ()" <<endl;)); jmp_buf kansas, void oz () (Rainbow RB, for (int i = 0; i <3; i + +) cout <<"er det ikke, men hjemme \ n "; longjmp (Kansas, 47);) int main () (if (setjmp (Kansas) == 0) (cout <<" tornado, heks, munchkins ... \ n "; oz ();) else ( cout <<"tante Em!" <<"Jeg hadde den rareste drømmen ..." <<endl;)) ///:~ 

Sider: [Page - 1] [Side - 2] [Side - 3] [Side - 4] [Side - 5] [Side - 6] [Side - 7]

Tags: , , , , , , , ,

Som det du ser?

Bli en av soldatene ved å abonnere! Du vil bli den første til å vite når vi legger til flere gode innlegg akkurat som dette. Bli med opp av enten RSS-feeder eller Email Updates i dag!

Det er ingen kommentarer til dette innlegget. Du kan følge alle svar å denne komme inn igjennom RSS 2.0 feed . Du kan hoppe til slutten og legge igjen et svar , eller TrackBack fra ditt eget nettsted.


Legg igjen en kommentar

Du må være logget inn for å legge inn en kommentar.