Je li loša praksa uhvatiti bacanje?

1. Pregled

U ovom uputstvu pogledat ćemo implikacije od hvatanja Bacljivo.

2. The Bacljivo Razred

U Java dokumentaciji, Bacljivo razred definiran je kao „super-klasa svih pogrešaka i iznimaka u jeziku Java“.

Pogledajmo hijerarhiju Bacljivo razred:

The Bacljivo razred ima dvije izravne podrazrede - naime, Pogreška i Iznimka razreda.

Pogreška i njegove podklase su neprovjerene iznimke, dok su podklase Iznimka mogu biti potvrđene ili neprovjerene iznimke.

Pogledajmo vrste situacija koje program može doživjeti kad zakaže.

3. Situacije koje se mogu oporaviti

Postoje situacije u kojima je oporavak općenito moguć i može se riješiti provjerenim ili neprovjerenim podklasama Iznimka razred.

Na primjer, program možda želi koristiti datoteku koja slučajno ne postoji na navedenom mjestu, što rezultira oznakom FileNotFoundException biti bačen.

Sljedeći je primjer program koji pokušava pristupiti sistemskom resursu, a da za to nema dopuštenje, što rezultira neoznačenim Kontrola pristupaIznimka biti bačen.

Prema Java dokumentaciji, the Iznimka razred “označava uvjete koje razumna aplikacija možda želi uhvatiti“.

4. Nepopravljive situacije

Postoje slučajevi kada program može doći u stanje u kojem je oporavak nemoguć u slučaju kvara. Uobičajeni primjeri toga su kada se dogodi prelijevanje stoga ili JVM-u ponestane memorije.

U tim situacijama JVM baca StackOverflowError i OutOfMemoryError, odnosno. Kao što sugeriraju njihova imena, ovo su podrazredi Pogreška razred.

Prema Java dokumentaciji, the Pogreška razred “ukazuje na ozbiljne probleme koje razumna aplikacija ne bi trebala pokušati uhvatiti“.

5. Primjer oporavljivih i nenadoknadivih situacija

Pretpostavimo da imamo API koji pozivateljima omogućuje dodavanje jedinstvenih ID-ova u neko skladište pomoću addIDsToStorage metoda:

class StorageAPI {public void addIDsToStorage (int capacity, Set storage) baca CapacityException {if (kapacitet <1) {throw new CapacityException ("Kapacitet manji od 1 nije dozvoljen"); } int count = 0; while (count <kapacitet) {storage.add (UUID.randomUUID (). toString ()); brojati ++; }} // ostale metode idu ovdje ...}

Prilikom pozivanja može se pojaviti nekoliko potencijalnih točaka otkaza addIDsToStorage:

  • CapacityException - Provjerena podklasa od Iznimka prilikom prolaska a kapacitet vrijednost manja od 1
  • NullPointerException - Neprovjerena podklasa od Iznimka ako a nulti prostor za pohranu vrijednost je navedena umjesto primjerka Postavi
  • OutOfMemoryError - Neprovjerena podklasa od Pogreška ako JVM-u ponestane memorije prije izlaska iz dok petlja

The CapacityException i NullPointerException situacije su kvarovi od kojih se program može oporaviti, ali OutOfMemoryError je nenadoknadiv.

6. Hvatanje Bacljivo

Pretpostavimo da korisnik API-ja samo hvata Bacljivo u pokušaj uhvatiti pri pozivu addIDsToStorage:

javna praznina dodaj (StorageAPI api, int kapacitet, postavi pohranu) {try {api.addIDsToStorage (kapacitet, pohrana); } catch (bacanje) (// // učinite nešto ovdje}}

To znači da pozivni kod na isti način reagira na oporavljive i nenadoknadive situacije.

Opće je pravilo za rukovanje iznimkama da pokušaj uhvatiti blok mora biti što specifičniji u hvatanju iznimaka. To je, mora se izbjegavati sveobuhvatni scenarij.

Hvatanje Bacljivo u našem slučaju krši ovo opće pravilo. Da bi odvojeno reagirao na oporavljive i nenadoknadive situacije, pozivni broj bi morao pregledati instancu Bacljivo objekt unutar ulov blok.

Bolji način bio bi korištenje specifičnog pristupa u rješavanju iznimaka i izbjegavanje pokušaja rješavanja nenadoknadivih situacija.

7. Zaključak

U ovom smo članku pogledali implikacije ulova Bacljivo u pokušaj uhvatiti blok.

Kao i uvijek, puni izvorni kod primjera dostupan je na Githubu.