Проверяет на исключения в коде или использует выгоду попытки лучшая практика в Java?

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

Спасибо!!

badPanda

6
задан badpanda 18 March 2010 в 18:45
поделиться

7 ответов

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

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

Это не всегда верно в 100% случаев, но как общий подход, именно так он работает, особенно в Java.

3
ответ дан 8 December 2019 в 17:20
поделиться

Вкратце:

Проверенные исключения предназначены для перехвата

Непроверенных исключений, и ошибки могут всплывать. (это подклассы RuntimeException и Error ).

Это связано с тем, что отмеченные исключения являются «ожидаемыми» и программа может восстанавливаться после них. Непроверенные исключения - это такие исключения, из которых программа не может (легко) восстановиться.

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

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

5
ответ дан 8 December 2019 в 17:20
поделиться

Я всегда реализую try...catch(Throwable) (Throwable - это действительно ошибка, и ваше приложение не должно выполнять никаких дальнейших операций после получения такой ошибки) в ОДНОЙ точке моего кода, когда чрезвычайно важно знать, что произошло, чтобы это можно было зарегистрировать. Обычно это место - метод main.

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

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

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

0
ответ дан 8 December 2019 в 17:20
поделиться

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

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

С другой стороны, отмеченные исключения, как утверждали другие, являются исключениями, от которых ожидается восстановление программ.Хотя на практике это звучит как хорошая идея, проверенные исключения часто возникают, когда вы действительно не можете ничего сделать для устранения причины исключения. Таким образом, вы получаете много шаблонного кода (то есть блоков try-catch, чьи блоки исключений не делают ничего, кроме регистрации или печати причины исключения). Афайк, ни один новый язык программирования не поддерживает проверенные исключения из-за этого (даже JavaFX).

1
ответ дан 8 December 2019 в 17:20
поделиться

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

Если все просто, то лучше проверить ошибку и обработать ее, чем использовать try-catch. Например, если вы можете справиться с недействительным вводом, проверив его и напечатав сообщение типа "пожалуйста, попробуйте еще раз", вы не будете использовать try-catch.

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

2
ответ дан 8 December 2019 в 17:20
поделиться

Исключения, которые не вызваны ошибками программирования и/или могут быть восстановлены, должны быть пойманы. Другие не должны. В java обычно проверяемые исключения должны быть пойманы, а RunTimeExceptions и Errors - нет.

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

1
ответ дан 8 December 2019 в 17:20
поделиться

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

2
ответ дан 8 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: