Создание собственных подклассов исключений

Хотя встроенные исключения Java обрабатывают большинство частых ошибок, вероятно, вам потребуется создать ваши собственные типы исключений для обработки ситуаций, специфичных для ваших приложений. Это достаточно просто сделать: просто определите подкласс Exception (который, разумеется, является подклассом Throwable). Ваши подклассы не обязаны реализовывать что-либо — важно само их присутствие в системе типов, которое позволит использовать их как исключения.

Класс Exception не определяет никаких собственных методов. Естественно, он наследует методы, представленные в Throwable. Таким образом, всем исключениям, включая те, что вы создадите сами, доступны методы, определенные в Throwable. Они все перечислены в табл. 10.3.

Таблица 10.3. Методы, определенные в Throwable

Метод Описание
Throwable filllnStackTrace() Возвращает объект Throwable, содержащий полную трассировку стека. Этот объект может быть возбужден повторно.
Throwable getCause() Возвращает исключение, лежащее под текущим исключением. Если такого нет, возвращается null.
String getLocalizedMessage() Возвращает локализованное описание исключения.
String getMessage() Возвращает описание исключения.
StackTraceElement[] getStackTrace() Возвращает массив, содержащий трассировку стека и состоящий из элементов типа StackTraceElement. Метод в верхушке стека — это метод, который был вызван непосредственно перед тем, как было возбуждено исключение. Этот метод содержится в первом элементе массива. Класс StackTraceElement дает вашей программе доступ к информации о каждом элементе в трассировке, такой как имя его метода.
Throwable initCause (
Throwable исключение)
Ассоциирует исключение с вызывающим исключением, как причиной этого вызывающего исключения. Возвращает ссылку на исключение.
void printStackTrace() Отображает трассировку стека.
void printStackTrace (PrintStream лоток) Посылает трассировку стека в заданный поток.
void printStackTrace (PrintWriter поток) Посылает трассировку стека в заданный поток.
void setStackTrace(
StackTraceElement элементы[])
Посылает трассировку стека в элементы, переданные в элементы. Этот метод предназначен для специализированных приложений, а не для нормального применения.
String toString() Возвращает объект string, содержащий описание исключения. Этот метод вызывается из println () при выводе объекта Throwable.

Вы можете также переопределить один или более из этих методов в собственных классах исключений.

Exception определяет четыре конструктора. Два были добавлены в JDK 1.4 для поддержки цепочек исключений, о которых будет сказано в следующем разделе. Другие два показаны здесь:

Exception() Exception(String msg)

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

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

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

// Эта программа создает пользовательский тип исключения.
class MyException extends Exception {
private int detail;
MyException(int a) {
detail = a;
}
public String toString() {
return "MyException!" + detail ();"]";
}
}
class ExceptionDemo {
static void compute(int a)
throws MyException {
System.out.println("Вызван compute(" + a + ")");
if(a > 10)
throw new MyException(a);
System.out.println("Нормальное завершение");
}
public static void main(String args[]) {
try {
compute(1);
compute(20);
}
catch (MyException e) {
System.out.println("Перехвачено " + e) ;
}
}
}

В этом примере определен подкласс Exception с именем MyException. Этот подкласс достаточно прост: он имеет только конструктор и перегруженный метод toString (), отображающий значение исключения. Класс ExceptionDemo определяет метод под названием compute (), который возбуждает объект MyException. Это исключение возбуждается, когда целочисленный параметр compute () принимает значение больше 10.

Метод main () устанавливает обработчик исключений MyException, затем вызывает compute () с правильным параметром (меньше 10), и с неправильным, чтобы продемонстрировать оба пути выполнения кода. Ниже показан результат.

Вызван compute(1)
Нормальное завершение
Вызван compute(20)
Перехвачено MyException[20]