Пользовательские исключения
В Java предусмотрены встроенные исключения,
такие как NullPointerException
, ArithmeticException
,
IOException
и другие.
Однако в реальных приложениях часто возникают ситуации,
когда нужно создавать собственные (пользовательские) исключения для обработки
специфических ошибок.
Пользовательские исключения позволяют сделать код более читаемым и удобным для отладки.
Зачем создавать пользовательские исключения?
-
Семантика: Пользовательские исключения позволяют точно описать тип ошибки.
-
Гибкость: Можно добавлять дополнительные поля и методы для хранения информации об ошибке.
-
Удобство: Упрощает отладку и обработку ошибок в больших проектах.
Иерархия пользовательских исключений
-
Пользовательские исключения создаются путем наследования от классов
Exception
илиRuntimeException
.-
Если исключение должно быть проверяемым (checked), наследуйтесь от
Exception
. -
Если исключение должно быть непроверяемым (unchecked), наследуйтесь от
RuntimeException
.
-
Создание пользовательского исключения
-
Создайте класс, который наследуется от
Exception
илиRuntimeException
. -
Добавьте конструкторы:
-
Конструктор по умолчанию.
-
Конструктор с сообщением об ошибке.
-
Конструктор с сообщением и причиной (для цепочки исключений).
-
-
При необходимости добавьте дополнительные поля и методы.
Использование пользовательских исключений
-
Проверяемое исключение:
-
Должно быть обработано с помощью
try-catch
или объявлено в сигнатуре метода с помощьюthrows
.
public void processData() throws MyCheckedException { if (someCondition) { throw new MyCheckedException("Ошибка обработки данных"); } } -
-
Непроверяемое исключение:
-
Не требует обязательной обработки.
public void validateInput(String input) { if (input == null) { throw new MyUncheckedException("Входные данные не могут быть null"); } } -
Иногда в пользовательских исключениях нужно хранить дополнительную информацию об ошибке. Например, код ошибки.
Пример с дополнительными полямиЦепочка исключений
-
В Java можно связывать исключения, чтобы сохранить информацию о первоначальной причине ошибки.
-
Для этого используется конструктор с параметром
Throwable
.
Пример: Приложение для обработки заказов
Описание задачи:Мы создадим простое приложение для обработки заказов. Если заказ имеет некорректный ID (например, отрицательный или равный нулю), программа должна выбрасывать пользовательское исключение OrderProcessingException
.
-
Пользовательское исключение
OrderProcessingException
:-
Наследуется от
Exception
, что делает его проверяемым исключением. -
Имеет конструктор, который принимает сообщение об ошибке и передает его в родительский класс.
-
-
Класс
Order
:-
Содержит поле
orderId
, которое хранит идентификатор заказа. -
Конструктор
Order(int orderId)
инициализирует это поле. -
Метод
process()
проверяет корректностьorderId
. Если ID некорректен (меньше или равен нулю), выбрасывается исключениеOrderProcessingException
.
-
-
Класс
Main
:-
В методе
main
создается объектOrder
с некорректным ID (-1). -
Вызов метода
process()
обернут в блокtry-catch
, чтобы обработать возможное исключение. -
Если исключение возникает, программа выводит сообщение об ошибке.
-
Пример работы программы
Входные данные:Создается заказ с ID = -1.
Ошибка обработки заказа: Некорректный ID заказа: -1Пояснение:
-
Поскольку ID заказа равен -1, метод
process()
выбрасывает исключениеOrderProcessingException
. -
Исключение перехватывается в блоке
catch
, и выводится сообщение об ошибке.
Рекомендации
-
Именование: Имена пользовательских исключений должны заканчиваться на
Exception
(например,InvalidInputException
). -
Логирование: Всегда логируйте исключения для упрощения отладки.
-
Минимизация: Не создавайте избыточное количество пользовательских исключений. Используйте их только там, где это действительно необходимо.