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

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

1. Вступление

В этом руководстве мы рассмотримhow to create a custom exception in Java.

Мы покажем, как пользовательские исключения реализуются и используются как для проверенных, так и для непроверенных исключений.

2. Необходимость настраиваемых исключений

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

Однако иногда нам необходимо дополнить эти стандартные исключения нашими собственными.

Основными причинами введения пользовательских исключений являются:

  • Исключения бизнес-логики - исключения, характерные для бизнес-логики и рабочего процесса. Они помогают пользователям приложения или разработчикам понять, в чем именно заключается проблема

  • Чтобы поймать и предоставить конкретную обработку для подмножества существующих исключений Java

Java исключения могут быть проверены и сняты. В следующих разделах мы рассмотрим оба этих случая.

3. Пользовательское Проверенное Исключение

Проверенные исключения - это исключения, которые необходимо обрабатывать явно.

Давайте рассмотрим фрагмент кода, который возвращает первую строку файла:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) return file.nextLine();
} catch(FileNotFoundException e) {
    // Logging, etc
}

Приведенный выше код является классическим способом обработки проверенных исключений Java. Хотя код выдаетFileNotFoundException,, неясно, какова точная причина - файл не существует или имя файла недействительно.

Чтобы создать собственное исключение, мы должны расширить классjava.lang.Exception.

Давайте посмотрим на пример, создав пользовательское проверяемое исключение под названиемIncorrectFileNameException:.

public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }
}

Обратите внимание, что мы также должны предоставить конструктор, который принимаетString в качестве сообщения об ошибке и вызывает конструктор родительского класса.

Это все, что нам нужно сделать, чтобы определить настраиваемое исключение.

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

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine())
        return file.nextLine();
} catch (FileNotFoundException e) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException("Incorrect filename : " + fileName );
    }
    //...
}

Мы создали и использовали настраиваемое исключение, поэтому теперь пользователь может знать, что это за исключение. Этого достаточно? Следовательно, мыlosing the root cause of the exception.

Чтобы исправить это, мы также можем добавить в конструктор параметрjava.lang.Throwable. Таким образом, мы можем передать корневое исключение в вызов метода:

public IncorrectFileNameException(String errorMessage, Throwable err) {
    super(errorMessage, err);
}

ТеперьIncorrectFileNameException используется вместе с основной причиной исключения следующим образом:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }
    // ...
}

Вот как мы можем использовать собственные исключенияwithout losing the root cause from which they occurred.

4. Пользовательское непроверенное исключение

В нашем же примере предположим, что нам нужно специальное исключение, если имя файла не содержит расширения.

В этом случае нам понадобится настраиваемое непроверенное исключение, подобное предыдущему, поскольку эта ошибка будет обнаруживаться только во время выполнения.

To create a custom unchecked exception we need to extend the java.lang.RuntimeException class:

public class IncorrectFileExtensionException
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}

Следовательно, мы можем использовать это нестандартное исключение в нашем примере:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    } else {
        throw new IllegalArgumentException("Non readable file");
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }

    //...
} catch(IllegalArgumentException err) {
    if(!containsExtension(fileName)) {
        throw new IncorrectFileExtensionException(
          "Filename does not contain extension : " + fileName, err);
    }

    //...
}

5. Заключение

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

Код для примеров, использованных в этой статье, доступенover on Github.