Главная » Java » Создание новых типов исключений

0

Исключения в Java представляют собой объекты. Все типы исключений (то есть все классы, объекты которых возбуждаются в качестве исключений) должны расширять класс языка Java, который называется Throwable, или один из его подклассов. Класс Throwable содержит строку, которая может использоваться для описания исключения. По соглашению, новые типы исключений расширяют класс Exception, а не Throwable.

Исключения Java, главным образом, являются проверяемыми — это означает, что компилятор следит за тем, чтобы ваши методы возбуждали лишь те исключения, о которых объявлено в заголовке метода. Стандартные исключения времени выполнения и ошибки расширяют классы RuntimeException и Error, тем самым создавая непроверяемые исключения. Все исключения, определяемые программистом, должны расширять класс Exception, и, таким образом, они являются проверяемыми.

Иногда хочется иметь больше данных, описывающих состояние исключения, — одной строки, предоставляемой  классом Exception, оказывается недостаточно. В таких случаях можно расширить класс Exception и создать на его основе новый класс с дополнительными  данными (значения которых обычно задаются в конструкторе).

Например, предположим, что в интерфейс Attributed, рассмотренный в главе 4, добавился метод replaceValue, который заменяет текущее значение именованного атрибута новым. Если атрибут с указанным именем не существует, возбуждается исключение — вполне резонно предположить, что заменить несуществующий  атрибут не удастся. Исключение должно содержать имя атрибута и новое значение, которое пытались ему присвоить. Для работы с таким исключением создается класс NoSuchAttribiteException:

public class NoSuchAttributeException extends Exception {

public String attrName;

public Object newValue;

NoSuchAttributeException(String name, Object value) { super("No attribute named \"" + name + "\" found"); attrName = name;

newValue = value;

}

}

NoSuchAttribiteException расширяет Exception и включает конструктор, которому передается имя атрибута и присваиваемое значение; кроме того, добавляются открытые поля для хранения данных. Внутри конструктора вызывается конструктор суперкласса со строкой, описывающей происходящее. Исключения такого рода могут использоваться во фрагменте программы, перехватывающем  исключения, поскольку они выводят понятное человеку описание ошибки и данные, вызвавшие ее. Добавление полезной

информации — одна из причин, по которым создаются новые исключения.

Другая причина для появления новых типов исключений заключается в том, что тип является важной частью данных исключения, поскольку исключения перехватываются по их типу. Из этих соображений исключение NoSuch AttribiteException стоит создать даже в том случае, если вы не собираетесь включать в него новые данные; в этом случае программист, для которого представляет интерес только это исключение, сможет перехватить его отдельно от всех прочих исключений, запускаемых методами интерфейса Attributed или иными методами, применяемыми к другим объектам в том же фрагменте программы.

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

7.2. Оператор throw

Исключения возбуждаются оператором throw, которому в качестве параметра передается объект. Например, вот как выглядит реализация replaceValue в классе AttributedImpl из главы 4:

public void replaceValue(String name, Object newValue)

throws NoSuchAttributeException

{

Attr attr = find(name);   // Искать attr

if (attr == null)               // Если атрибут не найден

throw new NoSuchAttributeException(name, this);

attr.valueOf(newValue);

}

Метод replaceValue сначала ищет имя атрибута в текущем объекте Attr. Если атрибут не найден, то возбуждается объект-исключение  типа NoSuch AttribiteException и его конструктору предоставляются содержательные данные. Исключения являются

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

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

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии