Я работаю над Java-приложением и вижу, что исключения во время выполнения обрабатываются во многих местах. Например,
try {
// do something
} catch(NullPointerException e) {
return null;
}
Мои вопросы, когда это хорошая практика для обработки исключений во время выполнения? Когда исключения следует оставлять необработанными?
java
exceptions
Винот Кумар СМ
источник
источник
Ответы:
Это зависит.
Например,
Integer#parseInt
throwsNumberFormatException
(который является RTE), если предоставленная строка не может быть проанализирована. Но, конечно же, вы не хотите, чтобы ваше приложение зависало только потому, что пользователь написал «x» в текстовое поле, предназначенное для целых чисел? И как вы узнаете, может ли строка быть проанализирована, если вы сначала не попытаетесь ее проанализировать? Таким образом, в этом случае RTE - это просто сигнал ошибки, который должен вызвать какое-то сообщение об ошибке. Можно утверждать , что это должно быть проверено исключение, но что вы можете сделать - это не так .источник
Integer#parseInt
должен действительно вернутьMaybe<Integer>
вместо этого и не выдавать никаких исключений вообще.Исключения NullPointerException обычно являются признаком пропущенной нулевой проверки. Таким образом, вместо того, чтобы ловить это так, вы должны добавить соответствующую нулевую проверку, чтобы не вызывать исключения.
Но иногда целесообразно обрабатывать исключения RunTimeException. Например, когда вы не можете изменить код, чтобы добавить нулевую проверку в соответствующем месте, или когда исключение является чем-то отличным от NullPointerException.
Ваш пример обработки исключений ужасен. При этом вы потеряете трассировку стека и точную информацию о проблеме. И вы на самом деле не решаете эту проблему, так как вы, вероятно, вызовете еще одно исключение NullPointerException в другом месте и получите вводящую в заблуждение информацию о том, что произошло и как это решить.
источник
return null;
Лучшим решением будет всеобъемлющее исключение (которое будет элегантно, а не просто ).new
бросаетstd::bad_alloc
в C ++.Я работаю с ожидаемыми исключениями там, где я их ожидаю. (Как ошибки чтения / записи БД). Неожиданные исключения я всплываю. Где-то еще можно ожидать исключения и иметь логику для этого.
источник
Исключения должны быть именно такими ... исключениями. При использовании исключений рекомендуется использовать их для освещения ситуации, в которой происходит нечто, противоречащее тому, что вы ожидаете. Классическим примером является исключение FileNotFoundException, которое выдается, когда файла просто нет. Если вы проверяете существование файла, вы используете File.exists (), так как вы просто толкаете 10-футовую палку, чтобы увидеть, ударили ли вы что-нибудь.
Технически вы можете достичь тех же результатов, окружив его попыткой catch и используя файл, как если бы он существовал, но A) исключения, как правило, являются дорогостоящими, и B) программисты предполагают, что вы подразумевали, что файл существует, если он был в попытке поймать, что добавляет общую путаницу программы.
Во многих ситуациях я напишу метод, который выбирает какое-то значение из базы данных. Тысяча вещей может пойти не так, и, учитывая, что мне нужен только один маленький фрагмент информации, неудобно окружать вызов списком перехвата попыток, который содержит 5 различных исключений. Итак, я поймаю исключения в методе fetch. Если что-то пойдет не так, я предприму все необходимые действия, чтобы закрыть соединение с базой данных или еще что-то в предложении finally и вернуть ноль. Это хорошая практика не только потому, что это упрощает ваш код, но также и потому, что «null» отправляет то же сообщение, которое вы могли получить из исключения… что-то пошло не так, как планировалось. Управляйте особенностями исключений в методе fetch, но управляйте тем, что делать, когда что-то не так
Например:
источник
да, вы правильно обрабатываете исключения во время выполнения, что не является хорошей практикой.
источник