#java #exception #intellij-idea
#java #исключение #intellij-идея
Вопрос:
Вот мой вариант использования — у меня есть код в этом стиле
try {
someMethod();
} catch (Exception e) {
LOGGER.error("exception occurred", e);
//potentially more code
}
и определение этого метода просто
public void someMethod() {
//do something that doesn't throw an exception
}
Я хотел бы найти все try...catch
блоки, которые перехватывают класс верхнего уровня Exception
, и обернуть код, который явно не создает никаких исключений. Возможно ли это в IntelliJ IDEA?
Чтобы уточнить, я знаю о проверке избыточного предложения ‘throws’ — это очистка после него.
Я также знаю, что блок Catch может игнорировать проверку исключений — это не улавливает случай, который я описал, потому что исключения используются в коде. Проблема в том, что код фактически не генерирует исключение. Итак, теоретически это может перехватить NullPointerException
или другое непроверенное исключение, но я бы дополнительно проанализировал, действительно ли это полезно или нет. Моя цель — удалить весь ненужный код обработки исключений.
Комментарии:
1. Перехват
Exception
никогда не бывает избыточным . Например, он может перехватить StackOverflowError, который может быть выдан любой строкой кода в любое время. Компилятор Java уже будет жаловаться, если вы попытаетесь перехватить проверяемое исключение, которое не объявлено как генерируемое. Я не знаю, что вам нужно.2. @Michael это если он улавливает неправильное исключение. Опять же, это происходит после очистки избыточных
throws
предложений — какой-то код, возможно, однажды выдавал полезные исключения, но больше не будет. Я хотел бы лучше иметь возможность реагировать на исключения, которые могут появиться. К сожалению, перехваты очень широкие и обычно просто перехватываютсяException
, а обработка ошибок предназначена для чего-то более конкретного, чем NPE или ООМ, что затрудняет восстановление после них. Кроме того, еслиtry...catch
никогда не бывает избыточным, почему бы нам не обернуть каждую строку в это? Такого рода избыточность.3. «если
try...catch
никогда не бывает избыточным», за исключением того, что это не то, что я сказал. ПерехватException
всегда будет что-то делать. Поток управления всегда отличается из-за его наличия.4. @Michael конечно, и мы перехватываем
Exception
в каждой строке кода, который мы пишем? Может быть, мы оборачиваем каждый вызываемый нами метод вtry..catch(Exception)
? Я, конечно, этого не делаю, и я не думаю, что ошибаюсь. Я использую это при необходимости .5.Ты тупой. Если
Exception
перехвачен, поток управления всегда отличается от того, когда он не перехвачен. Следовательно, нет статического анализатора, который может сказать вам, когда его удалить. Это не безобидный рефакторинг — он потенциально изменяет поток управления всей программой. Я не выступаю за перенос каждой строки в блок try catch…… Когда я это вообще говорил? Я говорю, что если у вас уже есть один, никакой статический анализатор не может сказать вам, что вам нужно его удалить.
Ответ №1:
Вы можете получить доступ к этому предупреждению через меню Инспекций, а затем выполнить поиск Overly broad catch block
:
При включенной проверке помечаются все блоки catch, которые являются чрезмерно широкими. Вы также можете ограничить проверку только предупреждением о RuntimeException
, Exception
и Throwable
: