else
throw new SomeOtherExceptionO: } catch(SomeOtherException e) {
print("SomeOtherException. " + e); } catch(RuntimeException re) {
try { продолжение &
throw re.getCauseO, } catch(FileNotFoundException e) {
print("FileNotFoundException. " + e); } catch(IOException e) {
print("IOException- " + e); } catch(Throwable e) {
print("Throwable. " + e);
}
}
}
} /* Output-
Fi1eNotFoundException: java.iо.Fi1eNotFoundException
IOException: java.io.IOException
Throwable: java.lang.RuntimeException. Где Я?
SomeOtherExcepti on: SomeOtherExcepti on
*///:-
Метод WrapCheckedException.throwRuntimeException() содержит код, генери¬рующий различные типы исключений. Они перехватываются и «заворачивают¬ся» в объекты RuntimeException, становясь таким образом «причиной» этих ис¬ключений.
При взгляде на класс TurnOffChecking нетрудно заметить, что вызвать метод throwRuntimeException() можно и без блока try, поскольку он не возбуждает ни¬каких контролируемых исключений. Но когда вы будете готовы перехватить исключение, у вас будет возможность перехватить любое из них — достаточно поместить свой код в блок try. Начинаете вы с перехвата исключений, которые, как вы знаете, могут явно возникнуть в коде блока try, — в нашем случае первым делом перехватывается SomeOtherException. В конце вы перехватываете Runtime- Exception и заново возбуждаете исключение, являющееся его причиной (получая последнее методом getCause(), «завернутое» исключение). Так извлекаются из¬начальные исключения, обрабатываемые в своих предложениях catch.
Методика «заворачивания» управляемых исключений в объекты Runtime- Exception встречается в некоторых примерах книги. Другое возможное реше¬ние — создание собственного класса, производного от RuntimeException. Пере¬хватывать такое исключение не обязательно, но, если вы захотите, такая возможность существует.
Основные правила обработки исключений
Используйте исключения для того, чтобы:
• обработать ошибку на текущем уровне (избегайте перехватывать исклю¬чения, если вы не знаете, как с ними поступить);
• исправить проблему и снова вызвать метод, возбудивший исключение;
• предпринять все необходимые действия и продолжить выполнение без повторного вызова метода;
• попытаться найти альтернативный результат вместо того, который дол¬жен был бы произвести вызванный метод;
• сделать все возможное в текущем контексте и заново возбудить это же исключение, перенаправив его на более высокий уровень;
• сделать все, что можно в текущем контексте, и возбудить новое исключе¬ние, перенаправив его на более высокий уровень;
• завершить работу программы;
• упростить программу (если используемая вами схема обработки исклю¬чений делает все только сложнее, значит, она никуда не годится);
• добавить вашей библиотеке и программе безопасности (сначала это по¬может в отладке программы, а в дальнейшем окупится ее надежностью).
Резюме
Исключения являются неотъемлемой частью программирования на Java; суще¬ствует некий барьер, который невозможно преодолеть без умения работать с ними. По этой причине исключения были представлены именно в этой части книги — многими библиотеками (скажем, библиотекой ввода/вывода) просто невозможно нормально пользоваться без обработки исключений.
Одно из преимуществ обработки исключений состоит в том, что она позво¬ляет сосредоточиться на решаемой проблеме, а затем обработать все ошибки в описанном коде в другом месте. Хотя исключения обычно описываются как средство передачи информации и восстановления после ошибок на стадии вы¬полнения, я сильно сомневаюсь, что «восстановление» часто реализуется на практике. По моей оценке, это происходит не более чем в 10% случаев, и даже тогда в основном сводится к раскрутке стека к заведомо стабильному со¬стоянию вместо реального выполнения действий по восстановлению. На мой взгляд, ценность исключений в основном обусловлена именно передачей ин¬формации. Java фактически настаивает, что программа должна сообщать обо всех ошибках в виде исключений, и именно это обстоятельство обеспечивает Java большое преимущество перед языками вроде С++, где программа может сообщать об ошибках разными способами (а то и не сообщать вовсе).