Er det en dårlig praksis at fange kastbar?

1. Oversigt

I denne vejledning ser vi på implikationer at fange Kan kastes.

2. Den Kan kastes Klasse

I Java-dokumentationen er Kan kastes klasse er defineret som “superklassen af ​​alle fejl og undtagelser på Java-sproget“.

Lad os se på hierarkiet Kan kastes klasse:

Det Kan kastes Klassen har to direkte underklasser - nemlig Fejl og Undtagelse klasser.

Fejl og dens underklasser er ukontrollerede undtagelser, mens underklasser af Undtagelse kan enten være markeret eller ikke markeret undtagelser.

Lad os se på, hvilke typer situationer et program kan opleve, når det mislykkes.

3. Genoprettelige situationer

Der er situationer, hvor genopretning generelt er mulig og kan håndteres med enten afkrydsede eller ukontrollerede underklasser af Undtagelse klasse.

For eksempel vil et program muligvis bruge en fil, der tilfældigvis ikke findes på det angivne sted, hvilket resulterer i en markeret FileNotFoundException bliver kastet.

Et andet eksempel er programmet, der forsøger at få adgang til en systemressource uden at have tilladelse til det, hvilket resulterer i en ukontrolleret AdgangskontrolUndtagelse bliver kastet.

I henhold til Java-dokumentationen det Undtagelse klasse “angiver forhold, som en rimelig applikation måske vil fange“.

4. Uoprettelige situationer

Der er tilfælde, hvor et program kan komme i en tilstand, hvor opsving er umulig i tilfælde af en fiasko. Almindelige eksempler på dette er, når et stack-overløb opstår, eller JVM løber tør for hukommelse.

I disse situationer kaster JVM StackOverflowError og OutOfMemoryError, henholdsvis. Som antydet af deres navne er disse underklasser af Fejl klasse.

I henhold til Java-dokumentationen, det Fejl klasse “angiver alvorlige problemer, som en rimelig applikation ikke bør forsøge at fange“.

5. Eksempel på genoprettelige og uoprettelige situationer

Lad os antage, at vi har en API, der giver opkaldere mulighed for at tilføje unikke id'er til nogle lagerfaciliteter ved hjælp af addIDsToStorage metode:

klasse StorageAPI {public void addIDsToStorage (int capacity, Set storage) kaster CapacityException {if (capacity <1) {throw new CapacityException ("Kapacitet på mindre end 1 er ikke tilladt"); } int antal = 0; while (count <capacity) {storage.add (UUID.randomUUID (). toString ()); tælle ++; }} // andre metoder går her ...}

Flere potentielle fejlpunkter kan opstå, når de påberåber sig addIDsToStorage:

  • CapacityException - En kontrolleret underklasse af Undtagelse når du passerer en kapacitet værdi på mindre end 1
  • NullPointerException - En ukontrolleret underklasse af Undtagelse hvis en null opbevaring værdi angives i stedet for en forekomst af Sæt
  • OutOfMemoryError - En ukontrolleret underklasse af Fejl hvis JVM løber tør for hukommelse, inden den afsluttes mens løkke

Det CapacityException og NullPointerException situationer er fejl, programmet kan komme sig fra, men OutOfMemoryError er en uoprettelig.

6. Fangst Kan kastes

Lad os antage, at brugeren af ​​API kun fanger Kan kastes i prøve-fangst når du ringer addIDsToStorage:

public void add (StorageAPI api, int capacity, Set storage) {prøv {api.addIDsToStorage (capacity, storage); } fangst (kastbar) {// gør noget her}}

Dette betyder, at opkaldskoden reagerer på genoprettelige og uoprettelige situationer på samme måde.

Den generelle regel ved håndtering af undtagelser er, at prøve-fangst blok skal være så specifik som mulig for at fange undtagelser. Det er, et fangst-scenarie skal undgås.

Fangst Kan kastes i vores tilfælde overtræder denne generelle regel. For at reagere på inddrivelige og uoprettelige situationer hver for sig, skal kaldekoden inspicere forekomsten af Kan kastes objekt inde i fangst blok.

Den bedre måde ville være at bruge en bestemt tilgang til håndtering af undtagelser og undgå at forsøge at håndtere uoprettelige situationer.

7. Konklusion

I denne artikel så vi på konsekvenserne af at fange Kan kastes i en prøve-fangst blok.

Som altid er den fulde kildekode i eksemplet tilgængelig på Github.


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