Читаем Философия Java3 полностью

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 для перехвата всех исключений. Так как ссылка на текущее исключение уже имеется, вы попросту возбуждаете исключение по этой ссылке:

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().

Перейти на страницу:

Похожие книги

Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT