Какой смысл объявлять исключение, а не обрабатывать его? - PullRequest
3 голосов
/ 24 марта 2012

Насколько я понимаю, если вы объявите только проверенное исключение, оно будет распространяться по всем вашим методам вплоть до метода main и все равно прерывать ваш обычный программный поток, и ваша программа все равно перестанет работать. Итак, почему бы не всегда обрабатывать проверенные исключения с помощью try / catch ... чтобы ваша программа не остановилась из-за исключения? Зачем вообще объявлять исключение в сигнатуре метода? Извините за мой плохой английский

Ответы [ 4 ]

10 голосов
/ 24 марта 2012

Насколько я понимаю, если вы объявите только проверенное исключение, оно будет распространяться через все ваши методы вплоть до метода main и все равно прерывать ваш обычный программный поток, и ваша программа все равно перестанет работать.

Абсолютно. И это хорошо , если что-то случилось, что вы действительно не можете справиться.

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

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

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

Но безоговорочно перехватывать все исключения и делать вид, что они не произошли?

3 голосов
/ 24 марта 2012

Исключением является то, что вы можете выбрать на каком уровне , чтобы поймать их;вам не нужно делать это немедленно - иногда это правильно, но одно предложение catch верхнего уровня может обрабатывать все другие исключения, регистрируя их и затем переходя к следующей задаче / запросу (например, в сервлете).контейнер).

Проверенные исключения Java пытаются сделать этот механизм более явным, заставляя вас обрабатывать или объявлять исключения.Это не позволяет вам забывать об исключениях, которые вы хотели бы обработать немедленно.

Однако многие люди считают, что это был неудачный эксперимент в языковой структуре (обратите внимание, что ни один другой язык не принял проверенные исключения), потому что это заставляет васиметь некоторый связанный с исключениями код на всех уровнях - именно то, что исключения предназначены, чтобы избежать.

1 голос
/ 24 марта 2012

Например, если вызывающий метод способен лучше обрабатывать исключение.

Скажем, у вас есть какой-то метод для чтения файла. Как этот метод узнает, что должно произойти, если файл не существует? Возможно, вся программа должна завершиться, возможно, мы должны сообщить пользователю всплывающее окно, возможно, оно должно зарегистрировать исключение и продолжить, возможно, оно должно попытаться восстановить файл из резервной копии. Только вызывающий метод знает, поэтому он должен реализовать обработку исключений.

0 голосов
/ 24 марта 2012

Это для более сложных систем.Тот, кто использует ваш код выше по цепочке, может захотеть узнать о том, что пошло не так, поэтому вы позволяете им обрабатывать исключение.Это не обязательно идет до main обязательно (и не может на самом деле, если КАЖДЫЙ метод в стеке не генерирует это исключение, которое победит всю цель.

...