Рубрики
Без рубрики

Обработчик глобальных Исключений Java

Узнайте, как глобально обрабатывать все неперехваченные исключения в вашем Java-приложении

Автор оригинала: baeldung.

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 .