Является ли проверка исключений в коде или использование try-catch лучшей практикой в Java?

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

спасибо!!

badPanda

7 ответов


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

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

это не верно 100% времени, но как общий подход, как это работает, в Java особенно.


короче:

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

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

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

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

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


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


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

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

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


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

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


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

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

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


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

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

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

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