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()); } }