1. введение
В этом уроке мы рассмотрим как создать пользовательское исключение в Java .
Мы покажем, как реализуются и используются пользовательские исключения как для проверенных, так и для непроверенных исключений.
Дальнейшее чтение:
Обработка исключений в Java
Проверенные и непроверенные исключения в Java
Общие исключения 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, неясно, какова точная причина – то ли файл не существует, то ли имя файла недопустимо.
Чтобы создать пользовательское исключение, мы должны расширить Чтобы создать пользовательское исключение, мы должны расширить класс.
Давайте рассмотрим пример этого, создав пользовательское проверяемое исключение с именем IncorrectFileNameException:
public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } }
Обратите внимание, что мы также должны предоставить конструктор, который принимает строку | в качестве сообщения об ошибке и вызывает конструктор родительского класса.
Это все, что нам нужно сделать, чтобы определить пользовательское исключение.
Далее давайте посмотрим, как мы можем использовать пользовательское исключение в нашем примере:
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 ); } //... }
Мы создали и использовали пользовательское исключение, так что теперь пользователь может точно знать, что это за исключение. Этого достаточно? Следовательно, мы теряем первопричину исключения .
Чтобы исправить это, мы также можем добавить java.lang.Параметр Throwable для конструктора. Таким образом, мы можем передать корневое исключение вызову метода:
public IncorrectFileNameException(String errorMessage, Throwable err) { super(errorMessage, err); }
Теперь исключение Неправильное имя файла используется вместе с основной причиной исключения, как это:
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); } // ... }
Вот как мы можем использовать пользовательские исключения без потери основной причины, из-за которой они возникли .
4. Пользовательское Непроверенное исключение
В нашем же примере предположим, что нам нужно пользовательское исключение, если имя файла не содержит расширения.
В этом случае нам понадобится пользовательское непроверенное исключение, аналогичное предыдущему, так как эта ошибка будет обнаружена только во время выполнения.
Чтобы создать пользовательское непроверенное исключение, нам нужно расширить 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. Заключение
Пользовательские исключения очень полезны, когда нам нужно обрабатывать конкретные исключения, связанные с бизнес-логикой. При правильном использовании они могут служить полезным инструментом для лучшей обработки исключений и ведения журнала.
Код для примеров, используемых в этой статье, доступен на Github .