Lag et tilpasset unntak i Java

1. Introduksjon

I denne veiledningen vil vi dekke hvordan lage et tilpasset unntak i Java.

Vi viser hvordan brukerdefinerte unntak implementeres og brukes til både avmerkede og ukontrollerte unntak.

2. Behovet for tilpassede unntak

Java-unntak dekker nesten alle generelle unntak som kommer til å skje i programmering.

Imidlertid trenger vi noen ganger å supplere disse standard unntakene med våre egne.

Hovedårsakene til å innføre tilpassede unntak er:

  • Unntak for virksomhetslogikk - Unntak som er spesifikke for forretningslogikken og arbeidsflyten. Disse hjelper applikasjonsbrukerne eller utviklerne med å forstå hva det eksakte problemet er
  • Å fange og gi spesifikk behandling til et delsett av eksisterende Java-unntak

Java-unntak kan kontrolleres og fjernes. I de neste avsnittene vil vi dekke begge disse sakene.

3. Spesifisert avkrysset unntak

Merkede unntak er unntak som må behandles eksplisitt.

La oss vurdere et stykke kode som returnerer den første linjen i filen:

prøv (Scanner file = new Scanner (new File (fileName))) {if (file.hasNextLine ()) return file.nextLine (); } fangst (FileNotFoundException e) {// Logging, etc} 

Koden ovenfor er en klassisk måte å håndtere Java-sjekket unntak på. Mens koden kaster FileNotFoundException, det er ikke klart hva den eksakte årsaken er - om filen ikke eksisterer eller filnavnet er ugyldig.

For å lage et tilpasset unntak må vi utvide java.lang. unntak klasse.

La oss se et eksempel på dette ved å lage et tilpasset krysset unntak kalt IncorrectFileNameException:

offentlig klasse IncorrectFileNameException utvider unntak {public IncorrectFileNameException (String errorMessage) {super (errorMessage); }} 

Merk at vi også må tilby en konstruktør som tar en String som feilmeldingen og kalte foreldreklassekonstruktøren.

Dette er alt vi trenger å gjøre for å definere et tilpasset unntak.

La oss deretter se hvordan vi kan bruke det tilpassede unntaket i eksemplet vårt:

prøv (Scanner file = new Scanner (new File (fileName))) {if (file.hasNextLine ()) return file.nextLine (); } fange (FileNotFoundException e) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Feil filnavn:" + filnavn); } // ...} 

Vi har opprettet og brukt et tilpasset unntak, slik at brukeren nå kan vite hva det eksakte unntaket er. Er dette nok? Det er vi følgelig mister grunnårsaken til unntaket.

For å fikse dette kan vi også legge til en java.lang. kastbar parameter til konstruktøren. På denne måten kan vi overføre rot unntaket til metodeanropet:

public IncorrectFileNameException (String errorMessage, Throwable err) {super (errorMessage, err); } 

Nå, den IncorrectFileNameException brukes sammen med grunnårsaken til unntaket som dette:

prøv (Scanner file = new Scanner (new File (fileName))) {if (file.hasNextLine ()) {return file.nextLine (); }} fange (FileNotFoundException err) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Feil filnavn:" + filnavn, feil); } // ...} 

Slik kan vi bruke tilpassede unntak uten å miste grunnårsaken de kom fra.

4. Tilpasset unchecked unntak

I det samme eksemplet, la oss anta at vi trenger et tilpasset unntak hvis filnavnet ikke inneholder noen utvidelse.

I dette tilfellet trenger vi et tilpasset, ukontrollert unntak som ligner på det forrige, da denne feilen bare blir oppdaget under kjøretiden.

For å lage et tilpasset unchecked unntak må vi utvide java.lang.RuntimeException klasse:

offentlig klasse IncorrectFileExtensionException utvider RuntimeException {public IncorrectFileExtensionException (String errorMessage, Throwable err) {super (errorMessage, err); }} 

Derfor kan vi bruke dette tilpassede unchecked unntaket i vårt eksempel:

prøv (Scanner file = new Scanner (new File (fileName))) {if (file.hasNextLine ()) {return file.nextLine (); } annet {kast ny IllegalArgumentException ("Ikke lesbar fil"); }} fange (FileNotFoundException err) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Feil filnavn:" + filnavn, feil); } // ...} catch (IllegalArgumentException err) {if (! containExtension (fileName)) {throw new IncorrectFileExtensionException ("Filnavn inneholder ikke utvidelse:" + filnavn, feil); } // ...} 

5. Konklusjon

Egendefinerte unntak er veldig nyttige når vi trenger å håndtere spesifikke unntak relatert til forretningslogikken. Når de brukes riktig, kan de tjene som et nyttig verktøy for bedre håndtering og logging av unntak.

Koden for eksemplene som brukes i denne artikkelen er tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found