|
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() + "()");
}
}
Следующий фрагмент кода регистрирует, где исключение произошло изнутри 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());
}
}