2009-08-18 3 views
0

Я использую JDK1.6_14. Однако это общий вопрос.Ошибки и исключения

Когда нужно обращаться за обработкой ошибок и когда обращаться за обработкой исключений?

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

Но когда идти, для какого метода?

Спасибо.

ответ

3

Есть такие случаи:

  1. Что-то может пойти не так, и вы можете что-то сделать (скажем, пользователь указал недопустимое значение в графическом интерфейсе).

  2. Что-то может пойти не так, но есть мало вы можете сделать (например, некоторые сервера в Интернете умер)

  3. Что-то может пойти не так и существующие исключения не несут достаточной информации, чтобы выяснить, что произошло (думаю, IOException("Can't read file") против IOException("Can't read file "+file) против IOException("Can't read file "+file.getAbsolutePath())).

Решения:

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

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

  3. Если пользователю или разработчику будет сложно выяснить, что произошло, увидев сообщение об исключении, обогатите его. Поэтому, когда File.delete() сбой, оберните его в RuntimeException, в котором говорится, что , который файл не может быть удален.

+0

Решение 1. Вы почти никогда не справляетесь с ошибкой, так как обычно это не может обрабатываться ** **. В зависимости от исключения это может быть или не быть возможно для его обработки (повторите попытку несколько раз, например, в случае исключения IOException). – extraneon

+0

Пожалуйста, внимательно прочитайте. Я сказал «ошибка», а не «Ошибка» (как в «java.lang.Error»). –

1

Класс Throwable имеет два непосредственных подкласса: ошибка и исключение. Подкласс Error в основном используется для сигнализации ненормальных системных условий. Подкласс Exception, как правило, может быть восстановлен. Вы можете обработать исключение, используя try-catch-finally.

+1

За исключением 'RuntimeException': P. –

+0

Вы можете поймать' RuntimeExceptions' так же, как и любое другое старое исключение. – Bombe

+0

Да, но я полагаю, что это не будет возмещаться практически в любой ситуации. –

2

Это может помочь понять разницу differences-betweeen-exception-and-error. Когда вы знаете разницу, вы можете справиться с ними. ;)

+1

Я думаю, что речь шла не об ошибке/исключении, а о том, когда бросать исключение или когда обрабатывать ошибку непосредственно там, где это происходит (например, «в методе») –

+0

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

6

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

Если вы собираетесь что-то делить, и у вас нет причин полагать, что делитель равен 0 (например, если он был введен пользователем), сначала проверьте вход.

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

В целом вы должны быть только Обработка исключений, которые вы не можете разумно предсказать - например. сбой ввода-вывода или веб-сервис, не присутствующий и т. д.

+0

Спасибо, Джон! Существуют ли какие-либо предопределенные правила или практики по этой теме? – bdhar

+0

Существует несколько общепринятых «правил» или «практики». И это может быть проблемой, если вы смешиваете библиотеки из разных источников. –

+1

Мои личные практики: не поймайте Ошибки или Throwables, и не поймайте Исключения, если вы не справитесь с ними или не свернете их с полезной информацией для бедного сопровождающего, который будет вызван посреди ночи ... – extraneon

-2

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

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

+0

Система pr0n ! \ o/ – Bombe

Смежные вопросы