1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
9.8 异常匹配.md 4.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

9.8 Соответствие异常

При "вызове" исключения система управления исключениями будет последовательно искать "ближайший" обработчик в порядке, указанном при написании программы. Как только найдется подходящий обработчик, считается, что исключение было обработано, и поиск прекращается.

Между исключением и его обработчиком не требуется строго точной совместимости. Объект производного класса может соответствовать обработчику базового класса, как показано ниже:

//: 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.

9.8.1 Критерии использования исключений

Используйте исключения для выполнения следующих действий:

(1) Решите проблему и снова вызовите метод, который вызвал исключение.

(2) Урегулируйте ситуацию без повторного вызова метода.

(3) Вычислите другой результат вместо ожидаемого результата метода.

(4) В текущей среде постарайтесь решить проблему и "бросьте" такое же исключение в более высокую среду.

(5) В текущей среде постарайтесь решить проблему и "бросьте" другое исключение в более высокую среду.

(6) Остановить выполнение программы.

(7) Упростить кодирование. Если решение проблемы делает ситуацию еще более сложной, это может стать очень неприятным, поэтому лучше этого не делать.

(8) Сделать свои библиотеки и программы более безопасными. Это как "краткосрочное вложение" (удобство отладки), так и "долгосрочное вложение" (повышение надежности приложения).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master