ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Создание и использование кастомного исключения в Java

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для создания своего исключения необходимо наследоваться от класса Exception.

Java
Скопировать код
public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

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

Java
Скопировать код
throw new MyException("Очень необычное исключение");

Такой подход позволит передать конкретную информацию о проблеме, которая возникла в программе.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

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

При создании собственного исключения необходимо учитывать особенности возникающей ошибки.

Тонкая грань между проверяемыми и непроверяемыми

В Java исключения подразделяются на проверяемые и непроверяемые. Проверяемые исключения наследуются от класса Exception, исключая RuntimeException и его наследников, которые являются непроверяемыми. Золотой нормой является использование проверяемых исключений, если можно восстановить работу программы, и непроверяемых – для обозначения ошибок в логике программы.

Искусство создания конструкторов

Хорошо продуманное исключение дает возможность передачи подробных сообщений об ошибках или соответствующей информации через конструкторы:

Java
Скопировать код
public class BinaryDataNotFoundException extends Exception {
    // У каждой ошибки своя история
    public BinaryDataNotFoundException() {
        super("Потеряна в море двоичных кодов");
    }
    
    // Индивидуальная причина ошибки
    public BinaryDataNotFoundException(String message) {
        super(message);
    }
}

Конкретность versus повторное использование

Создавая своё исключение, стоит стремиться к тому, чтобы оно было конкретным и многоразово применимым для схожих ситуаций ошибок. Старайтесь избегать создания большого числа узкоспециализированных исключений, так как это ухудшает читаемость кода и нарушает принцип DRY (Don't Repeat Yourself — Не повторяйся).

Основные принципы обработки исключений

При использовании собственных исключений следует придерживаться стандартных способов обработки ошибок: предоставление полных и понятных сообщений, избегание пустых блоков catch и документирование ситуаций, при которых может быть выброшено исключение.

Визуализация

Создание собственного исключения можно сравнить с проектированием ключа :old_key:, который подходит к определённому «замку» (сценарию ошибки) в вашем коде:

Markdown
Скопировать код
Ваш код (🚪)                Ваше исключение (🔐)
-----------------------     --------------------------------
Общая логика               StandardKeyException
Работа с базами данных     DatabaseLockedException
Проверка входных данных    InvalidInputException

Специализированные ключи для особых случаев!

Ценность хорошего сообщения об ошибке

Так же, как важно знать своё местоположение в незнакомом городе, так же важны и осмысленные сообщения об ошибках в мире исключений.

Java
Скопировать код
throw new DataIntegrityViolationException("Хьюстон, у нас проблема: объект " + objectId + " не подпадает под контроль.");

Когда следует придерживаться классических решений

Для стандартных типов ошибок, предпочтительнее использовать встроенные исключения:

Java
Скопировать код
public void setAge(int age) {
    if (age < 0 || age > 150) {
        throw new IllegalArgumentException("Не может быть, тебе уже " + age + " лет! Ты что, долгожитель?");
    }
}

Создание собственных непроверяемых исключений путем расширения RuntimeException

Для решения уникальных задач быстро и без лишних усложнений можно наследовать непроверяемые исключения от RuntimeException:

Java
Скопировать код
public class ConfigurationError extends RuntimeException {
    public ConfigurationError(String message, Throwable cause) {
        super(message, cause);
    }
}

Полезные материалы

  1. Урок: Исключения (The Java™ Tutorials > Essential Java Classes) — полное руководство по обработке исключений в Java.
  2. Как выбросить исключение – The Java™ Tutorials — официальное руководство по генерации исключений.
  3. Издержки, связанные с Exception против Throwable в Java – Stack Overflow — дискуссия нюансов использования исключений в Java на платформе Stack Overflow.
  4. Исключения в Java – GeeksforGeeks — подробное изложение основ исключений в Java.
  5. Обработка исключений в Java | DigitalOcean — оглубленное изучение реализации и использования исключений в Java.
  6. Как создать свои исключения в Java – DZone — практические советы и примеры создания пользовательских исключений.
  7. Java – Исключения — учебный курс с примерами использования и создания исключений в Java.