Je zlá prax chytať hádzateľné?

1. Prehľad

V tomto výučbe sa pozrieme na dôsledky chytania Hoditeľné.

2. The Hoditeľné Trieda

V dokumentácii k Java je Hoditeľné trieda je definovaná ako „vynikajúca trieda všetkých chýb a výnimiek v jazyku Java“.

Pozrime sa na hierarchiu Hoditeľné trieda:

The Hoditeľné trieda má dve priame podtriedy - menovite Chyba a Výnimka triedy.

Chyba a jeho podtriedy sú nezaškrtnuté výnimky, zatiaľ čo podtriedy typu Výnimka je možné skontrolovať alebo nezaškrtnúť výnimky.

Pozrime sa na typy situácií, ktoré môže program zažiť, keď zlyhá.

3. Obnoviteľné situácie

Existujú situácie, kedy je zotavenie všeobecne možné a dá sa s ním zaobchádzať buď s kontrolovanými alebo nekontrolovanými podtriedami Výnimka trieda.

Napríklad program môže chcieť použiť súbor, ktorý v zadanom umiestnení neexistuje, čo má za následok začiarknutie FileNotFoundException byť vyhodený.

Ďalším príkladom je program, ktorý sa pokúša získať prístup k systémovým prostriedkom bez povolenia, čo vedie k nekontrolovaniu Riadenie prístupuVýnimka byť vyhodený.

Podľa dokumentácie Java, the Výnimka trieda „označuje podmienky, ktoré by rozumná aplikácia mohla chcieť chytiť“.

4. Nenapraviteľné situácie

Existujú prípady, kedy sa program môže dostať do stavu, keď je zotavenie nemožné v prípade poruchy. Bežné príklady sú, keď dôjde k pretečeniu zásobníka alebo dôjde k nedostatku pamäte JVM.

V týchto situáciách hodí JVM StackOverflowError a OutOfMemoryError, resp. Ako naznačuje ich názov, jedná sa o podtriedy Chyba trieda.

Podľa dokumentácie Java, the Chyba trieda „naznačuje vážne problémy, ktoré by sa rozumná aplikácia nemala snažiť chytiť“.

5. Príklad situácií, ktoré je možné zotaviť a obnoviť

Predpokladajme, že máme API, ktoré umožňuje volajúcim pridávať jedinečné ID do niektorých úložných zariadení pomocou addIDsToStorage metóda:

trieda StorageAPI {public void addIDsToStorage (int kapacita, Set storage) hodí CapacityException {if (kapacita <1) {hodiť novú CapacityException ("kapacita menšia ako 1 nie je povolená"); } počet int = 0; while (count <kapacita) {storage.add (UUID.randomUUID (). toString ()); počet ++; }} // ďalšie metódy nájdete tu ...}

Pri vyvolaní sa môže vyskytnúť niekoľko potenciálnych bodov zlyhania addIDsToStorage:

  • Výnimka kapacity - Skontrolovaná podtrieda Výnimka pri prejazde a kapacita hodnota menšia ako 1
  • NullPointerException - Nekontrolovaná podtrieda Výnimka Ak nulové úložisko hodnota je uvedená namiesto inštancie Nastaviť
  • OutOfMemoryError - Nekontrolovaná podtrieda Chyba ak JVM dôjde pamäť pred opustením zatiaľ čo slučka

The Výnimka kapacity a NullPointerException situácie sú zlyhania, z ktorých sa program môže zotaviť, ale OutOfMemoryError je nenávratný.

6. Chytanie Hoditeľné

Predpokladajme, že používateľ API iba chytá Hoditeľné v Skús chytiť pri volaní addIDsToStorage:

public void add (StorageAPI api, int capacity, Set storage) {try {api.addIDsToStorage (kapacita, úložisko); } catch (Throwable throwable) {// tu niečo urobte}}

To znamená, že volací kód reaguje na obnoviteľné a nedobytné situácie rovnakým spôsobom.

Všeobecným pravidlom pri vybavovaní výnimiek je, že: Skús chytiť blok musí byť pri chytaní výnimiek čo najkonkrétnejší. To znamená, musí sa zabrániť scenáru so všetkým.

Chytanie Hoditeľné v našom prípade porušuje toto všeobecné pravidlo. Aby bolo možné samostatne reagovať na obnoviteľné a nenapraviteľné situácie, musel by volací kód skontrolovať inštanciu Hoditeľné objekt vo vnútri chytiť blokovať.

Lepším spôsobom by bolo použiť osobitný prístup pri riešení výnimiek a vyhnúť sa pokusom o riešenie nezvratných situácií.

7. Záver

V tomto článku sme sa zaoberali dôsledkami chytania Hoditeľné v Skús chytiť blokovať.

Celý zdrojový kód príkladu je ako vždy k dispozícii na stránkach Github.


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