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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

catch(Exception е) {

System, out. pri nti пСБыло возбуждено исключение"): throw e:

}

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

Если вы просто заново возбуждаете исключение, информация о нем, выводимая методом printStackTrace,

будет по-прежнему относиться к месту возникновения исключения, но не к месту его повторного возбуждения. Если вам понадобится использовать новую трассировку стека, вызовите метод fi LLI n S ta с kT г а с e , который возвращает исключение (объект Throwable), созданное на базе старого с помещением туда текущей информации о стеке. Вот как это выглядит:

// exceptions/Rethrowing.java // Демонстрация метода fillInStackTraceO

public class Rethrowing {

public static void f throws Exception {

System.out.рппШССоздание исключения в f(D; throw new Exception ("возбуждено из f(D;

}

public static void g throws Exception { try {

f.

} catch(Exception e) {

System, out. pri ntl n("B методе g, e printStackTraceO"). e printStackTrace(System.out); throw e,

}

}

public static void h throws Exception { try {

f:

} catch(Exception e) {

System out.printlnC'B методе h, e.printStackTrace"),

e printStackTrace(System.out),

throw (Exception)e fill InStackTraceO,

}

}

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

go.

} catch(Exception e) {

System, out pri ntl n( "main- printStackTraceO"). e.printStackTrace(System out);

}

try {

hO.

} catch(Exception e) {

System out.printlnCmairr printStackTraceO"); e printStackTrace(System out);

}

}

} /* Output

Создание исключения в fO

java lang Exception thrown from f

at Rethrowing.f(Rethrowing.java 7) at Rethrowing g(Rethrowing java:11) at Rethrowi ng.mai n(Rethrowi ng.java:29) main. printStackTraceO

java.lang.Exception: thrown from f продолжение &

at Rethrowing.f(Rethrowing.java.7) at Rethrowing.g(Rethrowing java.11) at Rethrowing.main(Rethrowing.java 29) Создание исключения в f В методе h. e.printStackTraceO java.lang.Exception, thrown from f

at Rethrowi ng.f(Rethrowi ng.java•7) at Ret h rowi ng. h (Reth rowi ng. j a va: 20) at Rethrowing main(Rethrowing.java-35) main- printStackTraceO java lang.Exception: thrown from f

at Ret h rowi ng. h (Ret h rowi ng. j a va • 24) at Rethrowi ng.mai n(Rethrowi ng.java:35)

*///:-

Строка с вызовом fiUInStackTrace становится новой точкой выдачи исключения.

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

команде throw.

//: exceptions/RethrowNew java // Повторное возбуждение объекта, // отличающегося от первоначального

class OneException extends Exception {

public OneException(String s) { super(s); }

}

class TwoException extends Exception {

public TwoException(String s) { super(s), }

}

public class RethrowNew {

public static void f throws OneException {

System.out printin("создание исключения в f(D; throw new OneException("из f");

}

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

try {

f.

} catch(OneException e) {

System out.printin(

"Во внутреннем блоке try.

e printStackTraceO"). .

e.printStackTrace(System.out);

throw new TwoException("из внутреннего блока try"),

}

} catch(TwoException e) {

System.out.printin(

"Во внешнем блоке try, e.printStackTraceO"), e.printStackTrace(System.out),

}

}

создание исключения в f

Во внутреннем блоке try, е.printStackTraceO

OneException- thrown from fO

at RethrowNew.f(RethrowNew.java•15) at Reth rowNew.ma i n(Reth rowNew.j ava•20) Во внешнем блоке try, e.printStackTraceO TwoException из внутреннего блока try

at RethrowNew main(RethrowNew.java 25)

*///.-

О последнем исключении известно только то, что оно поступило из внутреннего блока try, но не из метода f.

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

Цепочки исключений

Зачастую необходимо перехватить одно исключение и возбудить следующее, не потеряв при этом информации о первом исключении — это называется цепочкой исключений (exception chaining). До выпуска пакета JDK 1.4 программистам приходилось самостоятельно писать код, сохраняющий информацию о предыдущем исключении, однако теперь конструкторам всех подклассов Throwable может передаваться объект– причина (cause). Предполагается, что причиной является изначальное исключение и передача ее в новый объект обеспечивает трассировку стека вплоть до самого его начала, хотя при этом создается и возбуждается новое исключение.

Интересно отметить, что единственными подклассами класса Throwable, принимающими объект-причину в качестве аргумента конструктора, являются три основополагающих класса исключений: Error (используется виртуальной машиной (JVM) для сообщений о системных ошибках), Exception и RuntimeException. Для организации цепочек из других типов исключений придется использовать метод initCause, а не конструктор.

Следующий пример демонстрирует динамическое добавление полей в объект DynamicFields во время работы программы:

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

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

Я тебя не отпущу

Коваленко Марья Сергеевна
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не отпущу

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Мужчина не моей мечты

Ардова Алиса
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Мужчина не моей мечты

Неверный

Тоцка Тала
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Неверный

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Ваше Сиятельство 9

Моури Эрли
9. Ваше Сиятельство
Фантастика:
боевая фантастика
попаданцы
стимпанк
аниме
фэнтези
5.00
рейтинг книги
Ваше Сиятельство 9

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Антимаг его величества. Том II

Петров Максим Николаевич
2. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том II

Гранд империи

Земляной Андрей Борисович
3. Страж
Фантастика:
фэнтези
попаданцы
альтернативная история
5.60
рейтинг книги
Гранд империи

Имперский Курьер

Бо Вова
1. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Имперский Курьер