Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Спецификация исключений состоит из ключевого слова throws, за которым перечисляются все возможные типы исключений. Примерное определение метода будет выглядеть так:

void f throws TooBig. TooSmall. DivZero { //...

Однако запись

void f { // ...

означает, что метод не вырабатывает исключений. (Кроме исключений, производных от RuntimeException, которые могут быть возбуждены практически в любом месте — об этом еще будет сказано.)

Обойти спецификацию исключений невозможно — если ваш метод возбуждает исключения и не обрабатывает

их, компилятор предложит либо обработать исключение, либо включить его в спецификацию. Жестким контролем за соблюдением правил сверху донизу Java гарантирует правильность использования механизма исключений во время компиляции программы.

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

Исключения, которые проверяются и навязываются еще на этапе компиляции программы, называют контролируемыми (checked).

Перехват произвольных исключений

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

catch(Exception е) {

System.out рппШСПерехвачено исключение");

}

Подобная конструкция не упустит ни одного исключения, поэтому ее следует размещать в самом конце списка обработчиков, во избежание блокировки следующих за ней обработчиков исключений.

Поскольку класс Exception является базовым для всех классов исключений, интересных программисту, сам он не предоставит никакой полезной информации об исключительной ситуации, но можно вызвать методы из его базового типа Throwable:

• String getMessage, String getLocalizedMessage возвращают подробное сообщение об ошибке (или сообщение, локализованное для текущего контекста);

• String toString возвращает короткое описание объекта Throwable, включая подробное сообщение, если оно присутствует;

• void printStackTrace, void printStackTrace(PrintStream), void printStack-Trace(java.io.PrintWriter) выводят информацию об объекте Throwable и трассировку стека вызовов для этого объекта. Трассировка стека вызовов показывает последовательность вызова методов, которая привела к точке возникновения исключения. Первый вариант отправляет информацию в стандартный поток ошибок, второй и третий — в поток по

вашему выбору (в главе «Ввод/вывод» вы поймете, почему типов потоков два);

• Throwable fiUInStackTrace записывает в объект Throwable информацию о текущем состоянии стека. Метод используется при повторном возбуждении

ошибок или исключений.

Вдобавок в вашем распоряжении находятся методы типа Object, базового для Throwable (и для всех остальных классов). При использовании исключений может пригодиться метод getClass, который возвращает информацию о классе объекта. Эта информация заключена в объекте типа Class. Например, вы можете узнать имя класса вместе с информацией о пакете методом getName или получить только имя класса методом getSimpleName.

Рассмотрим пример с использованием основных методов класса Exception:

//. exceptions/ExceptionMethods.java // Демонстрация методов класса Exception, import static net.mindview.util.Print.*;

public class ExceptionMethods {

public static void main(String[] args) { try {

throw new Exception("Мое исключение"); } catch(Exception e) {

print("Перехвачено"). print("getMessage:" + e.getMessageO); print("getLocalizedMessage." +

e.getLocali zedMessage);

print ("toStringO." + e); print("printStackTrace:"); e.printStackTrace(System.out);

}

}

} /* Output. Перехвачено

getMessageO :Moe исключение

getLocalizedMessage.Мое исключение

toStringO.java.lang.Exception: Мое исключение

printStackTraceO:

java lang Exception: Мое исключение

at ExceptionMethods main(ExceptionMethods.java 8)

*///:-

Как видите, методы последовательно расширяют объем выдаваемой информации — всякий последующий фактически является продолжением предыдущего.

Трассировка стека

Информацию, предоставляемую методом printStackTrace, также можно получить напрямую вызовом getStackTrace. Метод возвращает массив элементов трассировки, каждый из которых представляет один кадр стека. Нулевой элемент представляет вершину стека, то есть последний вызванный метод последовательности (точка, в которой был создан и инициирован объект Throwable).

Соответственно, последний элемент массива представляет «низ» стека, то есть первый вызванный элемент последовательности. Рассмотрим простой пример:

//: exceptions/WhoCalled.java

// Программный доступ к данным трассировки стека

public class WhoCalled { static void f {

// Выдача исключения для заполнения трассировочных данных try {

throw new ExceptionO; } catch (Exception e) {

for(StackTraceElement ste : e.getStackTraceO)

System.out.pri nt1n(ste.getMethodName):

}

}

static void g { f: } static void h { g; } public static void main(String[] args) { f:

System.out.printlnC................................");

g:

System, out. printlnC'--.............................."):

h;

}

} /* Output: f

main

f g

main

f g

h

main *///:-

Повторное возбуждение исключения

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

Поделиться:
Популярные книги

Газлайтер. Том 3

Володин Григорий Григорьевич
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Библия. Новый русский перевод

Коллектив авторов
Религия и эзотерика:
христианство
6.57
рейтинг книги
Библия. Новый русский перевод

Избранные произведения. I том [Компиляция]

Хаггард Генри Райдер
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Избранные произведения. I том [Компиляция]

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
6.20
рейтинг книги
Вечный. Книга III

Дюна: Дом Атрейдесов

Андерсон Кевин Джей
1. Прелюдия к Дюне
Фантастика:
научная фантастика
7.00
рейтинг книги
Дюна: Дом Атрейдесов

Сознающий ум. В поисках фундаментальной теории

Чалмерс Дэвид
Философия сознания
Научно-образовательная:
философия
5.00
рейтинг книги
Сознающий ум. В поисках фундаментальной теории

Полет к солнцу

Кинешемцева Мелания
Драматургия:
драма
5.00
рейтинг книги
Полет к солнцу

Легенды древнего Хенинга (сборник)

Олди Генри Лайон
Фантастика:
научная фантастика
5.00
рейтинг книги
Легенды древнего Хенинга (сборник)

Я до сих пор князь. Книга XXII

Дрейк Сириус
22. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор князь. Книга XXII

Цена предательства

Тамоников Александр
Спецназ
Детективы:
боевики
7.86
рейтинг книги
Цена предательства

Газлайтер. Том 38

Володин Григорий Григорьевич
38. История Телепата
Фантастика:
городское фэнтези
аниме
попаданцы
6.20
рейтинг книги
Газлайтер. Том 38

Железная маска (сборник)

Дюма-отец Александр
Приключения:
исторические приключения
5.00
рейтинг книги
Железная маска (сборник)

Целительные силы. Книга 1. Очищение организма и правильное питание. Биосинтез и биоэнергетика

Малахов Геннадий Петрович
Дом и Семья:
здоровье и красота
4.00
рейтинг книги
Целительные силы. Книга 1. Очищение организма и правильное питание. Биосинтез и биоэнергетика

Том 10. Мертвое озеро

Некрасов Николай Алексеевич
10. Собрание сочинений в пятнадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 10. Мертвое озеро