Создайте пользовательское исключение в 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.