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

0

Исключения – это объекты. Все типы исключений должны наследовать класс Throwab1е или один из классов, производных от него. Класс Throwab1е содержит поле типа String, предназначенное для хранения информации об исключении. Обычно новые типы исключений создаются на основе класса Exception, производного от Throwablе.

Говоря об исключениях, мы будем иметь в виду преимущественно объявляемые исключения; в случае применения объявляемых исключений компилятор получает возможность проверить, действительно ли метод генерирует только те исключения, которые обнародованы в его объявлении. Все исключения классов, наследующих Exception, относятся к категории объявляемых. Исключения времени выполнения и объекты ошибок классов RuntimeExceptionЕrror и производных от них принадлежат к группе необъявляемых исключений.

Объявляемые исключения служат для представления ситуаций, которые, несмотря на их "исключительный" характер, вполне предсказуемы, и поскольку они происходят, с ними необходимо уметь обращаться. Объявляя исключения, мы тем самым документально признаем возможность их возникновения и вынуждаем пользователя кода предпринимать соответствующие меры для устранения их последствий. Необъявляемые исключения отражают события, которые связаны, вообще говоря, с ошибками в логике кода и поэтому не могут быть успешно преодолены во время выполнения программы. Например, исключение типа IndexoutofBoundsException, генерируемое при попытке доступа к элементу массива с неверным значением индекса, уведомляет вас о том, что программа не корректно вычисляет индекс или неправильно проверяет значение, используемое в качестве индекса. Ошибки такого рода должны быть исправлены в исходном коде программы. Если принять во внимание, что ошибку легко допустить буквально в любой строке кода, будет совершенно неразумно пытаться объявлять и отлавливать все исключения "без исключения", поэтому многие из них и остаются в категории необъявляемых.

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

Предположим, например, что в интерфейс Attributed (мы упоминали о нем в главе 4) добавлен метод rеplaceValue. Метод выполняет замещение текущего значения указанного атрибута новым. Если атрибут с заданным именем не существует, следует предусмотреть действия по выбрасыванию соответствующего исключения, поскольку вполне резонно полагать, что метод способен иметь дело только с существующими атрибутами. Желательно, чтобы объект исключения располагал наимено-

ванием атрибута, виновного в происшедшем. Рассмотрим объявление класса исключений NosuchAttributeException, помогающего решить задачу:

public class NosuchAttributeException extends Exception {

 public String attrName;

public NosuchAttributeException(string name) {

suрег("Атрибут с именем \"" + name + "\" не найден");

attrName = name;

}

}

В состав класса NosuchAttributeExceptiоn, производного от Exceptiоn, добавлены конструктор, принимающий в качестве параметра строку наименования атрибута, и publiс-поле, предназначенное для ее хранения. В теле конструктора вызывается конструктор базового класса, которому передается строка описания ошибки. С точки зрения кода, выполняющего обработку ошибок, рассмотренный тип исключений достаточно полезен, так как он содержит и внятное описание ошибки, и наименование атрибута, отсутствие которого привело к ее возникновению.

Возможность добавления данных – это только один довод в пользу создания новых типов исключений. Другой, не менее важный, связан с тем, что тип исключения как таковой – это неотъемлемая часть информации об ошибке, поскольку исключения "отлавливаются" в соответствии с их типами. По этой причине класс NoSuchAttгibuteExceptiоn стоило "изобрести" даже в том случае, если бы нам и не требовались дополнительные поля данных. Теперь программист, заинтересованный в обработке именно этого исключения, в состоянии "отловить" его независимо от других исключений, которые могут быть сгенерированы методами интерфейса Attгibuted, реализованными в производных классах, или методами иных объектов, вызываемыми в той же области кода.

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

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

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