Манипулатор на глобално изключение на Java

1. Общ преглед

В този урок ще се съсредоточим върху обработчика на глобални изключения в Java. Първо ще обсъдим основите на изключенията и обработката на изключенията. Тогава ще имаме изчерпателен поглед върху манипулатора на глобални изключения.

За да научите повече за изключенията като цяло, разгледайте обработката на изключения в Java.

2. Какво е изключение?

Изключение е необичайно състояние, което възниква в кодова последователност по време на изпълнение или по време на компилация. Това ненормално състояние възниква, когато програма нарушава семантичните ограничения на езика за програмиране Java.

Изключенията, които възникват по време на компилацията, са отметнати изключения . Тези изключения са директни подкласове от класа Exception и е необходимо да се обработват тези изключения в кода.

Друг тип изключения са непроверените изключения . Компилаторът не проверява за тези изключения по време на компилацията. Тези изключения са директни подкласове на класа RuntimeException, който разширява класа Exception .

Също така не е необходимо да се обработват изключения по време на изпълнение в кода.

3. Манипулатори на изключения

Java е надежден език за програмиране. Една от основните характеристики, която го прави стабилен, е рамката за обработка на изключения. Това означава, че програмата може грациозно да излезе по време на грешка, вместо просто да се срине.

Всеки път, когато възникне изключение, се създава обект E xception , или от JVM, или от метода, изпълняващ кода. Този обект съдържа информацията за изключението. Обработката на изключения е начин за работа с този обект на изключение .

3.1. В опит улов блок

В следващия пример блокът try съдържа кода, който може да създаде изключение. Блокът catch съдържа логиката за обработка на това изключение.

Блокът catch улавя обекта Exception, който кодът в блока try повдига:

String string = "01, , 2010"; DateFormat format = new SimpleDateFormat("MM, dd, yyyy"); Date date; try { date = format.parse(string); } catch (ParseException e) { System.out.println("ParseException caught!"); }

3.2. В хвърлянето и хвърля Ключови думи

Алтернативно, методът може също да избере да хвърли изключението, вместо да го обработва. Това означава, че логиката за обработка на обекта Exception е написана някъде другаде.

Обикновено методът за извикване обработва изключението в такива случаи:

public class ExceptionHandler { public static void main(String[] args) { String strDate = "01, , 2010"; String dateFormat = "MM, dd, yyyy"; try { Date date = new DateParser().getParsedDate(strDate, dateFormat); } catch (ParseException e) { System.out.println("The calling method caught ParseException!"); } } } class DateParser { public Date getParsedDate(String strDate, String dateFormat) throws ParseException { DateFormat format = new SimpleDateFormat(dateFormat); try { return format.parse(strDate); } catch (ParseException parseException) { throw parseException; } } }

След това ще разгледаме манипулатора на глобални изключения като общ начин за справяне с изключенията.

4. Манипулатор на глобални изключения

Екземплярите на RuntimeException не са задължителни за обработка. Следователно, той все още оставя отворен прозорец за получаване на дългите следи от стека по време на изпълнение. За да се справи с това, Java предоставя интерфейс UncaughtExceptionHandler . Класът Thread съдържа това като вътрешен клас.

В допълнение към този интерфейс, изданието на Java 1.5 също въведе статичен метод setDefaultUncaughtExceptionHandler () в класа Thread . Аргументът на този метод е клас на манипулатор, който реализира интерфейса UncaughtExceptionHandler .

Освен това този интерфейс декларира метода uncaughtException (Thread t, Throwable e) . Той ще бъде извикан, когато дадена нишка t се прекрати поради даденото неуловено изключение e . Внедряващият клас реализира този метод и дефинира логиката за обработка на тези незаловени изключения.

Нека разгледаме следния пример, който хвърля ArithmeticException по време на изпълнение. Определяме класа Handler, който реализира интерфейса UncaughtExceptionHandler .

Този клас реализира метода uncaughtException () и дефинира логика за обработка на незаловени изключения в него:

public class GlobalExceptionHandler { public static void main(String[] args) { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); new GlobalExceptionHandler().performArithmeticOperation(10, 0); } public int performArithmeticOperation(int num1, int num2) { return num1/num2; } } class Handler implements Thread.UncaughtExceptionHandler { private static Logger LOGGER = LoggerFactory.getLogger(Handler.class); public void uncaughtException(Thread t, Throwable e) { LOGGER.info("Unhandled exception caught!"); } }

Тук изпълняваната в момента нишка е основната нишка. По този начин неговият екземпляр се предава на метода uncaughtException () заедно с повдигнатото изключение. Клас на манипулатор след дръжки това изключение.

Същото се отнася и за необработени проверени изключения. Да видим и бърз пример за това:

public static void main(String[] args) throws Exception { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); Path file = Paths.get(""); Files.delete(file); }

Тук методът Files.delete () хвърля проверен IOException, който допълнително се изхвърля от подписа на метода main () . Най- манипулатор ще хване това изключение, както добре.

По този начин UncaughtExceptionHandler помага при управлението на необработени изключения по време на изпълнение. Това обаче нарушава идеята за улавяне и обработка на изключението близо до точката на произход .

5. Заключение

В тази статия отделихме време, за да разберем какви са изключенията и кои са основните начини за справяне с тях. Също така установихме, че манипулаторът на глобални изключения е част от класа Thread и той обработва незаловените изключения по време на изпълнение.

След това видяхме примерна програма, която хвърля изключение по време на изпълнение и го обработва с помощта на глобален обработчик на изключения.

Примерните кодове за тази статия могат да бъдат намерени в GitHub.