Vytvorte si vlastnú výnimku v prostredí Java

1. Úvod

V tomto výučbe sa budeme zaoberať ako vytvoriť vlastnú výnimku v Jave.

Ukážeme si, ako sa používateľom definované výnimky implementujú a používajú pre začiarknuté aj nezaškrtnuté výnimky.

2. Potreba vlastných výnimiek

Výnimky Java pokrývajú takmer všetky všeobecné výnimky, ktoré sa pri programovaní nevyhnutne vyskytnú.

Tieto štandardné výnimky však niekedy musíme doplniť vlastnými.

Hlavné dôvody zavedenia vlastných výnimiek sú:

  • Výnimky obchodnej logiky - Výnimky špecifické pre obchodnú logiku a pracovný tok. Pomáhajú používateľom aplikácie alebo vývojárom pochopiť, o aký presný problém ide
  • Zachytiť a poskytnúť špecifické ošetrenie podmnožine existujúcich výnimiek Java

Výnimky Java je možné skontrolovať a zrušiť začiarknutie. V ďalších častiach sa budeme zaoberať oboma týmito prípadmi.

3. Vlastná zaškrtnutá výnimka

Zaškrtnuté výnimky sú výnimky, s ktorými je potrebné zaobchádzať výslovne.

Uvažujme kúsok kódu, ktorý vráti prvý riadok súboru:

try (Scanner file = new Scanner (new File (fileName)))) {if (file.hasNextLine ()) return file.nextLine (); } catch (FileNotFoundException e) {// Prihlásenie atď.} 

Vyššie uvedený kód predstavuje klasický spôsob spracovania výnimiek kontrolovaných Java. Zatiaľ čo kód hodí FileNotFoundException, nie je jasné, aká je presná príčina - či súbor neexistuje, alebo je názov súboru neplatný.

Aby sme vytvorili vlastnú výnimku, musíme rozšíriť java.lang.Výnimka trieda.

Pozrime sa na príklad vytvorenia vlastnej kontrolovanej výnimky s názvom IncorrectFileNameException:

verejná trieda IncorrectFileNameException rozširuje výnimku {public IncorrectFileNameException (reťazec errorMessage) {super (errorMessage); }} 

Upozorňujeme, že musíme tiež poskytnúť konštruktor, ktorý berie a String ako chybové hlásenie a zavolal konštruktor nadradenej triedy.

To je všetko, čo musíme urobiť, aby sme definovali vlastnú výnimku.

Ďalej sa pozrime, ako môžeme použiť vlastnú výnimku v našom príklade:

try (Scanner file = new Scanner (new File (fileName)))) {if (file.hasNextLine ()) return file.nextLine (); } catch (FileNotFoundException e) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Nesprávny názov súboru:" + názov súboru); } // ...} 

Vytvorili sme a použili sme vlastnú výnimku, aby používateľ teraz mohol vedieť, čo je presná výnimka. Je to dosť? Sme teda strata hlavnej príčiny výnimky.

Aby sme to napravili, môžeme pridať aj a java.lang. Hoditeľné parameter do konštruktora. Týmto spôsobom môžeme odovzdať koreňovú výnimku volaniu metódy:

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

Teraz IncorrectFileNameException sa používa spolu s hlavnou príčinou výnimky, ako je táto:

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); } // ...} 

Takto môžeme použiť vlastné výnimky bez straty hlavnej príčiny, z ktorej nastali.

4. Vlastná nekontrolovaná výnimka

V našom rovnakom príklade predpokladajme, že potrebujeme vlastnú výnimku, ak názov súboru neobsahuje žiadnu príponu.

V takom prípade budeme potrebovať vlastnú nezačiarknutú výnimku podobnú tej predchádzajúcej, pretože táto chyba bude zistená iba za behu programu.

Ak chcete vytvoriť vlastnú nekontrolovanú výnimku, musíme rozšíriť java.lang.RuntimeException trieda:

public class IncorrectFileExtensionException rozširuje RuntimeException {public IncorrectFileExtensionException (String errorMessage, Throwable err) {super (errorMessage, err); }} 

Preto môžeme v našom príklade použiť túto vlastnú nekontrolovanú výnimku:

try (Scanner file = new Scanner (new File (fileName)))) {if (file.hasNextLine ()) {return file.nextLine (); } else {hod novy IllegalArgumentException ("necitatelny subor"); }} catch (FileNotFoundException err) {if (! isCorrectFileName (fileName)) {throw new IncorrectFileNameException ("Incorrect filename:" + fileName, err); } // ...} catch (IllegalArgumentException err) {if (! containsExtension (fileName)) {throw new IncorrectFileExtensionException ("Filename neobsahuje príponu:" + fileName, err); } // ...} 

5. Záver

Vlastné výnimky sú veľmi užitočné, keď potrebujeme spracovať konkrétne výnimky súvisiace s obchodnou logikou. Pri správnom použití môžu slúžiť ako užitočný nástroj na lepšie spracovanie a zaznamenávanie výnimiek.

Kód príkladov použitých v tomto článku je k dispozícii na stránkach Github.