Creați o excepție personalizată în Java

1. Introducere

În acest tutorial, vom prezenta cum să creați o excepție personalizată în Java .

Vom arăta cum sunt implementate și utilizate excepțiile definite de utilizator atât pentru excepțiile bifate, cât și pentru cele nebifate.

2. Nevoia de excepții personalizate

Excepțiile Java acoperă aproape toate excepțiile generale care trebuie să se întâmple în programare.

Cu toate acestea, uneori trebuie să completăm aceste excepții standard cu ale noastre.

Principalele motive pentru introducerea excepțiilor personalizate sunt:

  • Excepții de logică de afaceri - Excepții specifice logicii de afaceri și fluxului de lucru. Acestea ajută utilizatorii aplicației sau dezvoltatorii să înțeleagă care este problema exactă
  • Pentru a prinde și a oferi tratament specific unui subset de excepții Java existente

Excepțiile Java pot fi verificate și debifate. În secțiunile următoare, vom acoperi ambele cazuri.

3. Excepție verificată personalizat

Excepțiile verificate sunt excepții care trebuie tratate în mod explicit.

Să luăm în considerare o bucată de cod care returnează prima linie a fișierului:

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

Codul de mai sus este un mod clasic de gestionare a excepțiilor verificate Java. În timp ce codul aruncă FileNotFoundException, nu este clar care este cauza exactă - dacă fișierul nu există sau numele fișierului este nevalid.

Pentru a crea o excepție personalizată, trebuie să extindem clasa java.lang.Exception .

Să vedem un exemplu în acest sens prin crearea unei excepții verificate personalizate numită IncorrectFileNameException:

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

Rețineți că trebuie să oferim și un constructor care să ia un șir ca mesaj de eroare și să numească constructorul clasei părinte.

Aceasta este tot ce trebuie să facem pentru a defini o excepție personalizată.

În continuare, să vedem cum putem folosi excepția personalizată în exemplul nostru:

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

Am creat și utilizat o excepție personalizată, astfel încât utilizatorul să poată ști acum care este excepția exactă. Este suficient? În consecință, pierdem cauza principală a excepției .

Pentru a remedia acest lucru, putem adăuga, de asemenea, un parametru java.lang.Throwable la constructor. În acest fel, putem trece excepția rădăcină la apelul metodei:

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

Acum, IncorrectFileNameException este utilizat împreună cu cauza principală a excepției, astfel:

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

Acesta este modul în care putem folosi excepții personalizate fără a pierde cauza principală din care au apărut .

4. Excepție personalizată fără bifare

În același exemplu, să presupunem că avem nevoie de o excepție personalizată dacă numele fișierului nu conține nicio extensie.

În acest caz, vom avea nevoie de o excepție nebifată personalizată similară celei anterioare, deoarece această eroare va fi detectată numai în timpul rulării.

Pentru a crea o excepție nebifată personalizată, trebuie să extindem clasa java.lang.RuntimeException :

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

Prin urmare, putem folosi această excepție nebifată personalizată în exemplul nostru:

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. Concluzie

Excepțiile personalizate sunt foarte utile atunci când trebuie să gestionăm excepții specifice legate de logica de afaceri. Atunci când sunt utilizate în mod corespunzător, acestea pot servi ca un instrument util pentru o mai bună manipulare și înregistrare a excepțiilor.

Codul pentru exemplele utilizate în acest articol este disponibil pe Github.