Возможно ли в IntelliJ найти (возможно) избыточные блоки try … catch?

#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 :

введите описание изображения здесь