Пользовательские исключения
В 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). -
Логирование: Всегда логируйте исключения для упрощения отладки.
-
Минимизация: Не создавайте избыточное количество пользовательских исключений. Используйте их только там, где это действительно необходимо.