Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Исключения
Раздел: Как Выдать Исключения
Цепочечные Исключения
Домашняя страница > Существенные Классы > Исключения

Цепочечные Исключения

Приложение часто отвечает на исключение, выдавая другое исключение. В действительности первое исключение вызывает второе исключение. Может быть очень полезно знать, когда одно исключение вызывает другого. Цепочечные Исключения помогают программисту сделать это.

Следующее является методами и конструкторами в Throwable та поддержка объединенные в цепочку исключения.

Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)

Throwable параметр initCause и Throwable конструкторы являются исключением, которое вызвало текущее исключение. getCause возвращает исключение, которое вызвало текущее исключение, и initCause устанавливает причину текущего исключения.

Следующий пример показывает, как использовать цепочечное исключение.

try {

} catch (IOException e) {
    throw new SampleException("Other IOException", e);
}

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

Доступ к Трассировочной информации Стека

Теперь давайте предположим, что высокоуровневый обработчик исключений хочет вывести трассировку стека в своем собственном формате.


Определение: трассировка стека предоставляет информацию об истории выполнения текущего потока и перечисляет имена классов и методов, которые вызвали в точке, когда исключение произошло. Трассировка стека является полезным средством отладки, которое Вы будете обычно использовать в своих интересах, когда исключение было выдано.

Следующий код показывает, как вызвать getStackTrace метод на объекте исключения.

catch (Exception cause) {
    StackTraceElement elements[] = cause.getStackTrace();
    for (int i = 0, n = elements.length; i < n; i++) {       
        System.err.println(elements[i].getFileName()
            + ":" + elements[i].getLineNumber() 
            + ">> "
            + elements[i].getMethodName() + "()");
    }
}

Журналирование API

Следующий фрагмент кода регистрирует, где исключение произошло изнутри catch блок. Однако, вместо того, чтобы вручную анализировать трассировку стека и отправить вывод System.err(), это отправляет вывод файлу, используя средство журналирования в java.util.logging пакет.

try {
    Handler handler = new FileHandler("OutFile.log");
    Logger.getLogger("").addHandler(handler);
    
} catch (IOException e) {
    Logger logger = Logger.getLogger("package.name"); 
    StackTraceElement elements[] = e.getStackTrace();
    for (int i = 0, n = elements.length; i < n; i++) {
        logger.log(Level.WARNING, elements[i].getMethodName());
    }
}

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Выдать Исключения
Следующая страница: Создание Классов исключений