Возможно ли найти, где конкретное генерируемое исключение может быть перехвачено в eclipse?

#java #eclipse #exception

#java #eclipse #исключение

Вопрос:

Я пытаюсь отследить утечку ресурсов ввода-вывода, когда соединение открыто, но не обязательно закрыто:

 try{ 
     ...
     urlConnection.connect();
     ...
     connectionResult.setResultInputStream(urlConnection.getInputStream());
     return connectionResu<

} catch (IOException e) {
     throw new ValidationException(e, new LocationData(submissionURL.toExternalForm(), -1, -1));
}
  

Есть ли способ, которым я могу узнать, где ValidationException будет перехвачено через иерархию вызовов? Шаги, выполняемые вручную, примерно такие:

  1. Вызываете ли вы иерархию содержащего метода
  2. Для каждого вызывающего:
    • Проанализируйте окружающий код, найдя блоки try catch
    • Если перехвачено исключение, оцените закрытие потока
    • Если нет, повторите 1.

Примечания

  • Это невозможно воспроизвести; только у одного клиента есть эта проблема в их среде отработки отказа — версии продукта 5 лет, и раньше она никогда не показывала подобных проблем.
  • Я могу найти все случаи, когда генерируется исключение; Я хочу найти, где это конкретное генерируемое исключение могло быть перехвачено (включая catch Exception etc)

Ответ №1:

Это, конечно, не поддерживается Eclipse «из коробки». Это может быть плагин Eclipse, который поддерживает это, но я не слышал ни об одном. (Это то, что вам редко приходится делать на практике… таким образом, нет особого оправдания для того, чтобы прилагать усилия для реализации этого.)

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

Другой альтернативой может быть совместное использование пользовательского правила PMD для определения соответствующих перехватов. Хотя я не думаю, что это было бы просто…

Комментарии:

1. Да — не стоит усилий пытаться запустить Jonas с моим приложением 6-летней давности…

2. плюс тот факт, что оно не воспроизводимо

3. @Stephen — Я не понимаю вашего комментария по поводу «jonas». Вы имеете в виду JOnAS? Какое это имеет отношение к вашему вопросу?

4. Да, Джонас — настройка чрезмерно сложного устаревшего приложения на незнакомой технологии с отладкой и т.д., Как правило, отнимает часы времени, где моя ручная проверка должна быть более правильной и заняла всего 10-15 млн. Просто не стоит усилий, чтобы сэкономить моему мозгу немного работы, вот и все.

Ответ №2:

Перейдите в Поиск-> Java. В диалоговом окне вы можете выполнить поиск конструкторов и установить ограничение на ссылки. Это должно дать вам все места, где генерируется исключение.

Комментарии:

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

Ответ №3:

Как насчет динамического анализа? Если вы можете отлаживать свою программу, вы можете установить исключение точки останова из представления точек останова. Это маленькая кнопка с ‘!’ и ‘J’ на ней, и она будет прерываться каждый раз, когда генерируется исключение, о котором вы заботитесь. Затем вы можете перейти, чтобы увидеть, где оно перехвачено.

Конечно, он найдет только те случаи, которые вы можете реально реализовать путем отладки.

Комментарии:

1. Да; к сожалению, моя проблема не воспроизводима (я добавил примечания к вопросу)

Ответ №4:

Вы можете использовать анализатор памяти, такой как jvisualvm / visualvm, и заставить его регистрировать распределение объектов. Когда вы ожидаете, что все ресурсы будут закрыты, проверьте живые объекты и узнайте, где они были созданы.

Комментарии:

1. Проблема в том, что это воспроизводимо только в одной клиентской среде (их системе отработки отказа) для продукта, которому около 5 лет…

Ответ №5:

Ошибка 296947 — [иерархия вызовов] Найти, где находятся блоки catch для исключенияhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=296947