Javni rukovatelj iznimkama

1. Pregled

U ovom uputstvu usredotočit ćemo se na Global Exception Handler u Javi. Prvo ćemo razgovarati o osnovama iznimaka i rukovanju iznimkama. Tada ćemo imati sveobuhvatan uvid u rukovatelja globalnim iznimkama.

Da biste saznali više o iznimkama općenito, pogledajte Rukovanje iznimkama na Javi.

2. Što je iznimka?

Iznimka su abnormalna stanja koja nastaju u slijedu koda tijekom izvođenja ili u vrijeme sastavljanja. Ovo abnormalno stanje nastaje kada program krši semantička ograničenja programskog jezika Java.

Iznimke koje se javljaju za vrijeme sastavljanja su provjerene iznimke. Te su iznimke izravne potklase sustava Iznimka klase, a s tim je iznimkama potrebno postupati u kodu.

Druga vrsta izuzetaka su neprovjerene iznimke. Prevoditelj ne provjerava ove iznimke tijekom vremena sastavljanja. Te su iznimke izravne potklase sustava RuntimeException klasa koja proširuje Iznimka razred.

Također, u kodu nije potrebno rukovati iznimkama tijekom izvođenja.

3. Rukovatelji iznimkama

Java je robustan programski jezik. Jedna od osnovnih značajki koja ga čini robusnim je okvir za rukovanje iznimkama. To znači da program može elegantno izaći u vrijeme pogreške, umjesto da samo padne.

Kad god se dogodi iznimka, Exception objekt je izgrađen, bilo JVM-om ili metodom koja izvršava kôd. Ovaj objekt sadrži informacije o iznimci. Rukovanje iznimkama je način rješavanja ovoga Iznimka objekt.

3.1. The pokušaj uhvatiti Blok

U sljedećem primjeru, probati blok sadrži kôd koji može izbaciti iznimku. The ulov blok sadrži logiku za rukovanje ovom iznimkom.

The ulov blok hvata Iznimka objekt koji kod u probati povišice blokova:

Niz niza = "01, 2010"; DateFormat format = novi SimpleDateFormat ("MM, dd, gggg"); Datum datuma; probajte {date = format.parse (string); } catch (ParseException e) {System.out.println ("ParseException uhvaćen!"); }

3.2. The bacanje i baca Ključne riječi

Alternativno, metoda također može odlučiti baciti iznimku umjesto da je obrađuje. To znači logika za rukovanje Iznimka objekt je napisan negdje drugdje.

Obično metoda pozivanja obrađuje iznimku u takvim slučajevima:

javna klasa ExceptionHandler {javna statička void glavna (String [] args) {String strDate = "01,, 2010"; String dateFormat = "MM, dd, gggg"; isprobajte {Date date = novi DateParser (). getParsedDate (strDate, dateFormat); } catch (ParseException e) {System.out.println ("Metoda pozivanja uhvatila je ParseException!"); }}} klasa DateParser {javni datum getParsedDate (String strDate, String dateFormat) baca ParseException {DateFormat format = new SimpleDateFormat (dateFormat); isprobajte {return format.parse (strDate); } catch (ParseException parseException) {baciti parseException; }}}

Dalje ćemo razmotriti Global Exception Handler kao generički način za rješavanje iznimki.

4. Rukovatelj globalnim iznimkama

Primjerci RuntimeException nisu obavezni za rukovanje. Slijedom toga, i dalje ostavlja otvoren prozor za dobivanje dugih tragova steka tijekom izvođenja. Da biste to riješili, Java nudi UncaughtExceptionHandler sučelje. The Nit razred sadrži ovo kao unutarnju klasu.

Pored ovog sučelja, Izdanje Java 1.5 također je uvelo statičku metodu setDefaultUncaughtExceptionHandler () u Nit razred. Argument ove metode je klasa rukovatelja koja implementira UncaughtExceptionHandler sučelje.

Nadalje, ovo sučelje deklarira metodu uncaughtException (nit t, mogućnost bacanja e). Pozvat će se kada zadana nit t prestaje zbog zadate neuhvaćene iznimke e. Provedbena klasa implementira ovu metodu i definira logiku za rukovanje tim nehvaćenim iznimkama.

Razmotrimo sljedeći primjer koji baca znak ArithmeticException za vrijeme izvođenja. Mi definiramo razred Rukovatelj koja implementira sučelje UncaughtExceptionHandler.

Ova klasa provodi metodu uncaughtException () i definira logiku za rukovanje neuhvaćenim iznimkama u njemu:

javna klasa GlobalExceptionHandler {public static void main (String [] args) {Handler globalExceptionHandler = new Handler (); Thread.setDefaultUncaughtExceptionHandler (globalExceptionHandler); novi GlobalExceptionHandler (). performArithmeticOperation (10, 0); } javni int performArithmeticOperation (int num1, int num2) {return num1 / num2; }} Handler klase implementira Thread.UncaughtExceptionHandler {private static Logger LOGGER = LoggerFactory.getLogger (Handler.class); javna praznina uncaughtException (nit t, baciva e) {LOGGER.info ("Uhvaćena neobrađena iznimka!"); }}

Ovdje je trenutno izvršavaća nit glavna nit. Dakle, njegova se instanca prenosi na metodu uncaughtException () zajedno s podignutom iznimkom. Razred Rukovatelj zatim obrađuje ovu iznimku.

Isto se odnosi na neobrađene provjerene iznimke. Pogledajmo i brzi primjer ovoga:

public static void main (String [] args) baca izuzetak {Handler globalExceptionHandler = new Handler (); Thread.setDefaultUncaughtExceptionHandler (globalExceptionHandler); Datoteka puta = Paths.get (""); Files.delete (datoteka); }

Evo, Files.delete () metoda baca provjereno IOException, koje dalje baca glavni() potpis metode. The Rukovatelj uhvatit će i ovu iznimku.

Na ovaj način, UncaughtExceptionHandler pomaže u upravljanju neobrađenim iznimkama tijekom izvođenja. Međutim, to razbija ideju hvatanja i rukovanja iznimkom u blizini točke ishodišta.

5. Zaključak

U ovom smo članku uzeli vremena da shvatimo koje su iznimke i koji su osnovni načini za njihovo rješavanje. Također smo utvrdili da je rukovatelj globalnim iznimkama dio Nit klase i obrađuje neuhvaćene izuzeće tijekom izvođenja.

Zatim smo vidjeli uzorak programa koji baca izuzetak u vrijeme izvođenja i obrađuje ga pomoću globalnog rukovatelja izuzecima.

Primjeri kodova za ovaj članak mogu se naći na GitHubu.