1. Обзор
В этом уроке мы сосредоточимся на глобальном обработчике исключений в Java. Сначала мы обсудим основы исключений и обработки исключений. Затем мы подробно рассмотрим глобальный обработчик исключений.
Чтобы узнать больше об исключениях в целом, взгляните на обработку исключений в Java .
2. Что такое исключение?
Исключение-это ненормальное состояние, возникающее в последовательности кода во время выполнения или во время компиляции. Это ненормальное состояние возникает, когда программа нарушает семантические ограничения языка программирования Java.
Исключения, возникающие во время компиляции, являются проверенными исключениями . Эти исключения являются прямыми подклассами класса Exception , и необходимо обрабатывать эти исключения в коде.
Другим типом исключений являются непроверенные исключения . Компилятор не проверяет наличие этих исключений во время компиляции. Эти исключения являются прямыми подклассами класса RuntimeException , который расширяет класс Exception .
Кроме того, нет необходимости обрабатывать исключения во время выполнения в коде.
3. Обработчики Исключений
Java-это надежный язык программирования. Одной из основных функций, которая делает его надежным, является структура обработки исключений. Это означает, что программа может изящно выйти в момент ошибки, а не просто сбой.
Всякий раз, когда возникает исключение , объект E exception создается либо JVM, либо методом, выполняющим код. Этот объект содержит информацию об исключении. Обработка исключений-это способ обработки этого Исключения объекта.
3.1. Блок try-catch
В следующем примере блок 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 во время выполнения. Мы определяем класс Обработчик , реализующий интерфейс 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); }
Вот файлы .метод delete() вызывает проверенное исключение IOException, которое далее вызывается сигнатурой метода main () . Обработчик | также перехватит это исключение.
Таким образом, UncaughtExceptionHandler помогает управлять необработанными исключениями во время выполнения. Однако это нарушает идею перехвата и обработки исключения вблизи точки происхождения .
5. Заключение
В этой статье мы потратили время, чтобы понять, что такое исключения и каковы основные способы их обработки. Кроме того, мы определили, что глобальный обработчик исключений является частью класса Thread и обрабатывает неперехваченные исключения во время выполнения.
Затем мы увидели пример программы, которая создает исключение runtimeexception и обрабатывает его с помощью глобального обработчика исключений.
Примеры кодов для этой статьи можно найти на GitHub .