Создание и использование кастомного исключения в Java
Быстрый ответ
Для создания своего исключения необходимо наследоваться от класса Exception
.
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
Чтобы сгенерировать это исключение, используйте команду throw
.
throw new MyException("Очень необычное исключение");
Такой подход позволит передать конкретную информацию о проблеме, которая возникла в программе.
Продумывание дизайна пользовательского исключения
При создании собственного исключения необходимо учитывать особенности возникающей ошибки.
Тонкая грань между проверяемыми и непроверяемыми
В Java исключения подразделяются на проверяемые и непроверяемые. Проверяемые исключения наследуются от класса Exception
, исключая RuntimeException
и его наследников, которые являются непроверяемыми. Золотой нормой является использование проверяемых исключений, если можно восстановить работу программы, и непроверяемых – для обозначения ошибок в логике программы.
Искусство создания конструкторов
Хорошо продуманное исключение дает возможность передачи подробных сообщений об ошибках или соответствующей информации через конструкторы:
public class BinaryDataNotFoundException extends Exception {
// У каждой ошибки своя история
public BinaryDataNotFoundException() {
super("Потеряна в море двоичных кодов");
}
// Индивидуальная причина ошибки
public BinaryDataNotFoundException(String message) {
super(message);
}
}
Конкретность versus повторное использование
Создавая своё исключение, стоит стремиться к тому, чтобы оно было конкретным и многоразово применимым для схожих ситуаций ошибок. Старайтесь избегать создания большого числа узкоспециализированных исключений, так как это ухудшает читаемость кода и нарушает принцип DRY (Don't Repeat Yourself — Не повторяйся).
Основные принципы обработки исключений
При использовании собственных исключений следует придерживаться стандартных способов обработки ошибок: предоставление полных и понятных сообщений, избегание пустых блоков catch и документирование ситуаций, при которых может быть выброшено исключение.
Визуализация
Создание собственного исключения можно сравнить с проектированием ключа :old_key:, который подходит к определённому «замку» (сценарию ошибки) в вашем коде:
Ваш код (🚪) Ваше исключение (🔐)
----------------------- --------------------------------
Общая логика StandardKeyException
Работа с базами данных DatabaseLockedException
Проверка входных данных InvalidInputException
Специализированные ключи для особых случаев!
Ценность хорошего сообщения об ошибке
Так же, как важно знать своё местоположение в незнакомом городе, так же важны и осмысленные сообщения об ошибках в мире исключений.
throw new DataIntegrityViolationException("Хьюстон, у нас проблема: объект " + objectId + " не подпадает под контроль.");
Когда следует придерживаться классических решений
Для стандартных типов ошибок, предпочтительнее использовать встроенные исключения:
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("Не может быть, тебе уже " + age + " лет! Ты что, долгожитель?");
}
}
Создание собственных непроверяемых исключений путем расширения RuntimeException
Для решения уникальных задач быстро и без лишних усложнений можно наследовать непроверяемые исключения от RuntimeException
:
public class ConfigurationError extends RuntimeException {
public ConfigurationError(String message, Throwable cause) {
super(message, cause);
}
}
Полезные материалы
- Урок: Исключения (The Java™ Tutorials > Essential Java Classes) — полное руководство по обработке исключений в Java.
- Как выбросить исключение – The Java™ Tutorials — официальное руководство по генерации исключений.
- Издержки, связанные с Exception против Throwable в Java – Stack Overflow — дискуссия нюансов использования исключений в Java на платформе Stack Overflow.
- Исключения в Java – GeeksforGeeks — подробное изложение основ исключений в Java.
- Обработка исключений в Java | DigitalOcean — оглубленное изучение реализации и использования исключений в Java.
- Как создать свои исключения в Java – DZone — практические советы и примеры создания пользовательских исключений.
- Java – Исключения — учебный курс с примерами использования и создания исключений в Java.