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