При "вызове" исключения система управления исключениями будет последовательно искать "ближайший" обработчик в порядке, указанном при написании программы. Как только найдется подходящий обработчик, считается, что исключение было обработано, и поиск прекращается.
Между исключением и его обработчиком не требуется строго точной совместимости. Объект производного класса может соответствовать обработчику базового класса, как показано ниже:
//: Human.java
// Обработка иерархий исключений
class Annoyance extends Exception {}
class Sneeze extends Annoyance {}
public class Human {
public static void main(String[] args) {
try {
throw new Sneeze();
} catch(Sneeze s) {
System.out.println("Обработал Sneeze");
} catch(Annoyance a) {
System.out.println("Обработал Annoyance");
}
}
} ///:~
Исключение Sneeze
будет поймано первым подходящим catch
блоком. Конечно же, это первый вариант. Однако если мы уберем первый catch
блок:
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("Обработал Annoyance");
}
```Оставшиеся `catch` блоки всё ещё будут работать, так как они могут поймать исключение базового класса. Другими словами, `catch(Annoyance e)` сможет поймать `Annoyance` и любые производные от него классы. Это очень важно, поскольку если вы решите добавить больше исключений для метода, и все они наследуются от одного и того же базового класса, то клиентская программа не потребует изменений. По крайней мере, можно предположить, что она поймает исключение базового класса.Если вы поместите блок обработчика базового класса перед блоком обработчика производного класса, попытавшись "закрыть" производное исключение, как показано ниже:
```java
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("Обработал Annoyance");
} catch(Sneeze s) {
System.out.println("Обработал Sneeze");
}
Компилятор сгенерирует сообщение об ошибке, потому что он обнаруживает, что никогда не будет достигнут блок обработчика Sneeze
.
Используйте исключения для выполнения следующих действий:
(1) Решите проблему и снова вызовите метод, который вызвал исключение.
(2) Урегулируйте ситуацию без повторного вызова метода.
(3) Вычислите другой результат вместо ожидаемого результата метода.
(4) В текущей среде постарайтесь решить проблему и "бросьте" такое же исключение в более высокую среду.
(5) В текущей среде постарайтесь решить проблему и "бросьте" другое исключение в более высокую среду.
(6) Остановить выполнение программы.
(7) Упростить кодирование. Если решение проблемы делает ситуацию еще более сложной, это может стать очень неприятным, поэтому лучше этого не делать.
(8) Сделать свои библиотеки и программы более безопасными. Это как "краткосрочное вложение" (удобство отладки), так и "долгосрочное вложение" (повышение надежности приложения).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )