Java Global Exception Handler

Глобальный обработчик исключений Java

1. обзор

В этом руководстве мы сосредоточимся на глобальном обработчике исключений в Java. Сначала мы обсудим основы исключений и обработки исключений. Затем мы подробно рассмотрим глобальный обработчик исключений.

Чтобы узнать больше об исключениях в целом, посмотритеException Handling in Java.

2. Что такое исключение?

An exception is an abnormal condition that arises in a code sequence at runtime or at compile time. Это ненормальное состояние возникает, когда программа нарушает семантические ограничения языка программирования Java.

Exceptions that occur during the compile time are checked exceptions. Эти исключения являются прямыми подклассами классаException, и необходимо обрабатывать эти исключения в коде.

Another type of exceptions are the unchecked exceptions. The compiler does not check for these exceptions during the compile time. Эти исключения являются прямыми подклассами классаRuntimeException, который расширяет классException.

Кроме того, нет необходимости обрабатывать исключения времени выполнения в коде.

3. Обработчики исключений

Java - это надежный язык программирования. Одна из основных функций, которая делает его устойчивым, - это структура обработки исключений. Это означает, что программа может корректно завершить работу во время ошибки, а не просто сбой.

Whenever an exception occurs, an Exception object is constructed либо JVM, либо методом, выполняющим код. Этот объект содержит информацию об исключении. Exception handling is a way of handling this Exception object.

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. Ключевые словаthrow иthrows

В качестве альтернативы, метод может также выбрасывать исключение вместо его обработки. Это означает, что логика для обработки объекта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 provides the UncaughtExceptionHandler interface. КлассThread содержит это как внутренний класс.

В дополнение к этому интерфейсуJava 1.5 release also introduced a static method setDefaultUncaughtExceptionHandler() in the Thread class. Аргументом этого метода является класс обработчика, реализующий интерфейс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() вместе с возникшим исключением. Затем классHandler обрабатывает это исключение.

То же самое относится к необработанным проверенным исключениям. Давайте также посмотрим на быстрый пример этого:

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(). Handler также перехватит это исключение.

Таким образом,UncaughtExceptionHandler помогает управлять необработанными исключениями во время выполнения. Однако этоbreaks the idea of catching and handling the exception close to the point of origin.

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

В этой статье мы нашли время, чтобы понять, что такое исключения, и каковы основные способы их обработки. Кроме того, мы определили, что глобальный обработчик исключений является частью классаThread и обрабатывает неперехваченные исключения времени выполнения.

Затем мы увидели пример программы, которая генерирует исключение во время выполнения и обрабатывает его, используя глобальный обработчик исключений.

Примеры кодов для этой статьи можно найтиover on GitHub.