Skapa ett anpassat undantag i Java

1. Introduktion

I denna handledning kommer vi att beskriva hur man skapar ett anpassat undantag i Java .

Vi visar hur användardefinierade undantag implementeras och används för både kontrollerade och okontrollerade undantag.

2. Behovet av anpassade undantag

Java-undantag täcker nästan alla allmänna undantag som kommer att hända vid programmering.

Ibland behöver vi dock komplettera dessa standardundantag med våra egna.

Huvudskälen för att införa anpassade undantag är:

  • Undantag för affärslogik - Undantag som är specifika för affärslogiken och arbetsflödet. Dessa hjälper applikationsanvändarna eller utvecklarna att förstå vad det exakta problemet är
  • Att fånga och ge specifik behandling till en delmängd av befintliga Java-undantag

Java-undantag kan kontrolleras och avmarkeras. I nästa avsnitt behandlar vi båda dessa fall.

3. Anpassat kontrollerat undantag

Kontrollerade undantag är undantag som måste behandlas uttryckligen.

Låt oss överväga en kod som returnerar den första raden i filen:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch(FileNotFoundException e) { // Logging, etc } 

Koden ovan är ett klassiskt sätt att hantera undantag från Java. Medan koden kastar FileNotFoundException är det inte klart vad den exakta orsaken är - om filen inte finns eller filnamnet är ogiltigt.

För att skapa ett anpassat undantag måste vi utöka klassen java.lang.Exception .

Låt oss se ett exempel på detta genom att skapa anpassade kontrollerade undantag som heter IncorrectFileNameException:

public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } } 

Observera att vi också måste tillhandahålla en konstruktör som tar en sträng som felmeddelande och kallas den överordnade klasskonstruktören.

Det här är allt vi behöver göra för att definiera ett anpassat undantag.

Låt oss sedan se hur vi kan använda det anpassade undantaget i vårt exempel:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch (FileNotFoundException e) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException("Incorrect filename : " + fileName ); } //... } 

Vi har skapat och använt ett anpassat undantag, så att användaren nu kan veta exakt undantag. Är det här tillräckligt? Vi förlorar följaktligen grundorsaken till undantaget .

För att åtgärda detta kan vi också lägga till en java.lang.Throwable- parameter till konstruktören. På så sätt kan vi skicka rotundantaget till metodanropet:

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

Nu används IncorrectFileNameException tillsammans med grundorsaken till undantaget så här:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } // ... } 

Så här kan vi använda anpassade undantag utan att förlora grundorsaken som de uppstod från .

4. Anpassat okontrollerat undantag

Låt oss i samma exempel anta att vi behöver ett anpassat undantag om filnamnet inte innehåller något tillägg.

I det här fallet behöver vi ett anpassat okontrollerat undantag som liknar det tidigare, eftersom detta fel bara kommer att upptäckas under körning.

Att skapa en anpassad okontrollerade undantag måste vi utöka java.lang.RuntimeException klassen :

public class IncorrectFileExtensionException extends RuntimeException { public IncorrectFileExtensionException(String errorMessage, Throwable err) { super(errorMessage, err); } } 

Därför kan vi använda detta anpassade okontrollerade undantag i vårt exempel:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } else { throw new IllegalArgumentException("Non readable file"); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } //... } catch(IllegalArgumentException err) { if(!containsExtension(fileName)) { throw new IncorrectFileExtensionException( "Filename does not contain extension : " + fileName, err); } //... } 

5. Sammanfattning

Anpassade undantag är mycket användbara när vi behöver hantera specifika undantag relaterade till affärslogiken. När de används korrekt kan de fungera som ett användbart verktyg för bättre undantagshantering och loggning.

Koden för exemplen som används i den här artikeln finns på Github.