Opret en brugerdefineret undtagelse i Java

1. Introduktion

I denne vejledning dækker vi det hvordan man opretter en brugerdefineret undtagelse i Java.

Vi viser, hvordan brugerdefinerede undtagelser implementeres og bruges til både markerede og ikke-markerede undtagelser.

2. Behovet for brugerdefinerede undtagelser

Java-undtagelser dækker næsten alle generelle undtagelser, der sandsynligvis sker under programmering.

Vi er dog undertiden nødt til at supplere disse standardundtagelser med vores egne.

Hovedårsagerne til at indføre brugerdefinerede undtagelser er:

  • Undtagelser fra forretningslogik - Undtagelser, der er specifikke for forretningslogikken og arbejdsgangen. Disse hjælper applikationsbrugerne eller udviklerne med at forstå, hvad det nøjagtige problem er
  • At fange og give specifik behandling til en delmængde af eksisterende Java-undtagelser

Java-undtagelser kan kontrolleres og ikke markeres. I de næste sektioner vil vi dække begge disse sager.

3. Custom Checked Undtagelse

Kontrollerede undtagelser er undtagelser, der skal behandles eksplicit.

Lad os overveje et stykke kode, der returnerer den første linje i filen:

prøv (Scannerfil = ny Scanner (ny fil (filnavn))) {hvis (file.hasNextLine ()) returnerer file.nextLine (); } fange (FileNotFoundException e) {// Logning osv.} 

Koden ovenfor er en klassisk måde at håndtere Java-kontrollerede undtagelser på. Mens koden kaster FileNotFoundException, det er ikke klart, hvad den nøjagtige årsag er - om filen ikke findes, eller filnavnet er ugyldigt.

For at oprette en brugerdefineret undtagelse skal vi udvide java.lang.Undtagelse klasse.

Lad os se et eksempel på dette ved at oprette brugerdefineret kontrolleret undtagelse kaldet IncorrectFileNameException:

offentlig klasse IncorrectFileNameException udvider Undtagelse {public IncorrectFileNameException (String errorMessage) {super (errorMessage); }} 

Bemærk, at vi også skal levere en konstruktør, der tager en Snor som fejlmeddelelsen og kaldte den overordnede klassekonstruktør.

Dette er alt, hvad vi skal gøre for at definere en brugerdefineret undtagelse.

Lad os derefter se, hvordan vi kan bruge den tilpassede undtagelse i vores eksempel:

prøv (Scannerfil = ny Scanner (ny fil (filnavn))) {hvis (file.hasNextLine ()) returnerer file.nextLine (); } fange (FileNotFoundException e) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Forkert filnavn:" + filnavn); } // ...} 

Vi har oprettet og brugt en brugerdefineret undtagelse, så brugeren nu kan vide, hvad den nøjagtige undtagelse er. Er det nok? Det er vi derfor mister grundårsagen til undtagelsen.

For at løse dette kan vi også tilføje en java.lang. kan kastes parameter til konstruktøren. På denne måde kan vi videregive rodundtagelsen til metodekaldet:

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

Nu, den IncorrectFileNameException bruges sammen med grundårsagen til undtagelsen som denne:

prøv (Scannerfil = ny Scanner (ny fil (filnavn))) {hvis (file.hasNextLine ()) {return file.nextLine (); }} fange (FileNotFoundException err) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Forkert filnavn:" + filnavn, fejlagtigt); } // ...} 

Sådan kan vi bruge brugerdefinerede undtagelser uden at miste grundårsagen, hvorfra de opstod.

4. Brugerdefineret ikke-markeret undtagelse

Lad os i vores samme eksempel antage, at vi har brug for en brugerdefineret undtagelse, hvis filnavnet ikke indeholder nogen udvidelse.

I dette tilfælde har vi brug for en brugerdefineret ikke-markeret undtagelse svarende til den forrige, da denne fejl kun vil blive detekteret under kørsel.

For at oprette en brugerdefineret ikke-markeret undtagelse skal vi udvide java.lang.RuntimeException klasse:

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

Derfor kan vi bruge denne brugerdefinerede ikke-markerede undtagelse i vores eksempel:

prøv (Scannerfil = ny Scanner (ny fil (filnavn))) {hvis (file.hasNextLine ()) {return file.nextLine (); } ellers {kast ny IllegalArgumentException ("Ikke-læsbar fil"); }} fange (FileNotFoundException err) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Forkert filnavn:" + filnavn, fejlagtigt); } // ...} fange (IllegalArgumentException err) {if (! containExtension (fileName)) {throw new IncorrectFileExtensionException ("Filnavn indeholder ikke udvidelse:" + filnavn, fejlagtigt); } // ...} 

5. Konklusion

Brugerdefinerede undtagelser er meget nyttige, når vi skal håndtere specifikke undtagelser relateret til forretningslogikken. Når de bruges korrekt, kan de fungere som et nyttigt værktøj til bedre håndtering og logning af undtagelser.

Koden til eksemplerne i denne artikel findes på Github.