единственным целью try
/catch
является управление потоком. Он предназначен для того, чтобы позволить нам выйти из любого цикла и даже пройти мимо вызывающего абонента и до функции более высокого уровня.
Однако он предназначен для исключительных условий, таких как использование нулевых ссылок, деление переполнения или отказ ввода-вывода файла. Это ошибки, которые препятствуют продолжению работы программы, и должен обрабатываться. Как правило, их трудно предсказать или очень редки.
Когда возникает исключительное условие, самое лучшее, что нужно сделать, это изменить поток управления, чтобы исключение было выброшено так далеко, как оно должно быть, чтобы найти блок catch, готовый обработать его. Любой метод между ними прерывается и разматывается, даже если у него нет кода для проверки результатов.
Когда люди жалуются, используя try
/catch
для управления потоком, что они должны в виду, что это не для контроля потока в неисключительных условиях. Если все, что вы хотите сделать, это выйти из цикла, используйте break
или return
; не бросайте исключение, а затем ловите его. Это не то, за что нужны исключения, и не то, для чего они хороши.
+1 ответ Джона Уэлдона. Обратите внимание, что одним из очень неприятных аспектов части экосистемы Java (и которая является спецификацией Java) является чрезмерное использование ** проверенных ** исключений некоторыми API/фреймами. В основном, заставить пользователей API контролировать поток своей программы, улавливая бессмысленное исключение без проверки для вещей, которые не являются исключительными вообще. Некоторые рамки, такие как Spring, правильно спроектированы и действительно недовольны этой ужасно плохой практикой. Джошуа Блох в своей «Эффективной Java» рекомендует предпочесть «метод тестирования состояния» для ненужного исключения (исключений) проверенных исключений. – NoozNooz42
Привет Спасибо за ответ. «В основном, заставить пользователей API контролировать поток своей программы, улавливая бессмысленное исключение без проверки для вещей, которые не являются исключительными вообще». Итак, в чем разница между попытками между C++/Java? Кроме того, что вы имеете в виду «проверенные» исключения? Cheers – Muggen
См. Http://www.javapractices.com/topic/TopicAction.do?Id=129. Проверенные исключения по сути являются злоупотреблением исключениями для не исключительного контроля потока. Они также являются кошмаром для обслуживания. –