Броски или попытка поймать - PullRequest
68 голосов
/ 08 июля 2010

Каково общее эмпирическое правило при принятии решения о добавлении в метод предложения throws или использовании try-catch?

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

PS: искал через Google и SO, но хотел бы получить четкий ответ на этот вопрос.

Ответы [ 10 ]

51 голосов
/ 08 июля 2010
  • поймать исключение, только если вы можете обработать его осмысленно
  • объявляет выдачу исключения вверх, если оно будет обработано потребителем текущего метода
  • генерирует исключения, если они вызваны входными параметрами (но чаще всего они не проверяются)
14 голосов
/ 08 июля 2010

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

. И оно должно перехватывать исключение из вызываемого метода, если:

  • это что-то, что может быть обработано локально (например, попытка преобразовать входную строку в число, и если преобразование завершится неудачно, вместо этого вполне допустимо вернуть значение по умолчанию),
  • или этоне должно быть выброшено (например, если исключение исходит от специфичного для реализации нижнего уровня, детали реализации которого не должны быть видны вызывающей стороне - например, я не хочу показывать, что мой DAO использует Hibernate для сохранениямои сущности, поэтому я ловлю все HibernateExceptions локально и преобразую их в свои собственные типы исключений).
9 голосов
/ 08 июля 2010

Мое эмпирическое правило простое:

  • Могу ли я справиться с этим осмысленно (добавлено из комментария)? Так что введите код в try/catch. Под этим я подразумеваю возможность информировать пользователя / восстанавливаться после ошибки или, в более широком смысле, понимать, как это исключение влияет на выполнение моего кода.
  • В другом месте, выбросить

Примечание: этот ответ теперь является вики-сообществом, не стесняйтесь добавлять больше информации.

7 голосов
/ 08 июля 2010

Вот как я его использую:

Броски:

  • Вы просто хотите, чтобы код остановился, когда происходит ошибка.
  • Хорошо с методами, которые склонны к ошибки, если определенные предпосылки не встречал.

Try-Catch:

  • Когда вы хотите иметь программу вести себя по-разному с разными ошибки.
  • Отлично, если вы хотите предоставить значимые ошибки для конечных пользователей.

Я знаю много людей, которые всегда используют Throws, потому что он чище, но контроль не так уж и мал.

3 голосов
/ 13 июня 2013

Решение добавить в ваши методы try-catch или throws зависит от того, «как вы хотите (или имеете) обрабатывать ваше исключение».

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

Поэтому, отвечая на ваши вопросы, эмпирического правила не существует.

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

2 голосов
/ 08 июля 2010

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

1 голос
/ 23 декабря 2018

Когда использовать что. Я много искал об этом. Там нет жесткого и быстрого правила.

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

Источник: книга SCJP 6 Кэти Сьерра

1 голос
/ 13 июня 2013

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

Обратите внимание, что хотя Java и позволяет проверенным исключениям всплывать через метод, который объявлен как выбрасывающий исключения соответствующих типов,такое использование, как правило, следует рассматривать как анти-шаблон.Представьте, например, что некоторый метод LookAtSky() объявлен как вызывающий FullMoonException, и ожидается, что он бросит его, когда Луна заполнена;представьте далее, что LookAtSky() вызывает ExamineJupiter(), что также объявлено как throws FullMoonException.Если FullMoonException был сгенерирован ExamineJupiter(), и если LookAtSky() не перехватил его и не обработал или не обернул его в какой-то другой тип исключения, код, который вызывал LookAtSky, предполагал бы, что исключение было результатомПолнолуние Земли;он не имеет ни малейшего представления о том, что виновником может быть одна из спутников Юпитера.

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

0 голосов
/ 21 июня 2018

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

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

Надеюсь, это правильно: -)

0 голосов
/ 13 марта 2017

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

Если вы укажете метод для исключения, то, когда возникнет исключение, код перестанет бытьисполнено сразу.

...