Unntak vs. feil
Uventet atferd vil garantert oppstå når et program kjører. Dette kan skyldes unntak eller feil. Unntak er hendelser som kan forstyrre den normale programflyten. Feil er forhold som kan anses som uopprettelige. Unntak er stort sett knyttet til selve applikasjonen, mens feil er relatert til systemet programmet kjører på.
Hva er et unntak?
Unntak er en hendelse som kan forstyrre den normale programflyten. Navneunntaket kommer fra "eksepsjonell begivenhet". Å kaste et unntak er prosessen med å lage et unntaksobjekt og overlevere det til kjøretidssystemet. Unntaksobjekt er opprettet av metoden der unntaket skjedde. Unntaksobjektet inneholder nyttig informasjon som typen og beskrivelsen av unntaket. Når kjøretidssystemet mottar unntaksobjektet, vil det prøve å finne noen til å håndtere det i anropsstakken ved å krysse det i omvendt rekkefølge (der metodene ble k alt). Call stack er den ordnede listen over metoder, som ble k alt før metoden der unntaket skjedde. Runtime-systemet er vellykket hvis det finner en metode med en unntaksbehandler. Unntaksbehandler er en kodeblokk som offisielt kan håndtere nevnte unntak. Hvis kjøretidssystemet finner en passende behandler (dvs. typen unntak samsvarer med typen som kan håndteres), vil det sende unntaksobjektet til behandleren. Dette kalles å fange unntaket. Men hvis unntaket ikke kan håndteres, vil programmet avsluttes. I Java arver unntak fra «Throwable class». NullPointerException og ArrayIndexOutOfBoundsException er to vanlige unntak i Java.
Hva er en feil?
En feil er en tilstand som kan anses som uopprettelig, for eksempel at programmet krever en mengde minne som er større enn det som er tilgjengelig. Disse feilene kan ikke håndteres under kjøring. Hvis det oppstår en feil, vil programmet avsluttes. I Java arver feil fra Throwable-klassen. Feil står vanligvis for alvorlige problemer som programmereren (eller applikasjonen) ikke bør prøve å fange opp. Feil er ganske enkelt unormale forhold, som aldri forventes å oppstå under normale omstendigheter, og derfor aldri er forutsett. For eksempel er OutOfMemoryError, StackOverflowError og ThreadDead slike feil. Metoder skal aldri ha behandlere for feil.
Hva er forskjellen mellom unntak og feil?
Både feil og unntak er uønsket forekomst under kjøring av et program. Imidlertid har de viktige forskjeller. Unntak kan forutses av programmereren, mens en feil er vanskelig å forutse. Unntak kan krysses av eller fjernes. Men feil er alltid ukontrollert. Unntak indikerer vanligvis en feil forårsaket av programmereren. Imidlertid oppstår feil på grunn av en systemfeil eller upassende bruk av en ressurs. Derfor bør unntak håndteres på applikasjonsnivå, mens feil bør ivaretas på systemnivå (kun hvis mulig). Etter å ha håndtert et unntak, er du garantert å gå tilbake til normal programflyt. Men selv om en feil oppdages, kan det hende programmereren ikke vet hvordan han skal håndtere den i utgangspunktet. I motsetning til tradisjonell feilhåndtering tillater unntak å skille feilhåndteringskode fra vanlig kode.