Можно ли найти, где конкретное выброшенное исключение может быть поймано в затмении? - PullRequest
7 голосов
/ 10 мая 2011

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

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

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

Есть ли способ узнать, где ValidationException будет перехвачен через иерархию вызовов? Ручные шаги что-то вроде:

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

Примечания

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

Ответы [ 5 ]

1 голос
/ 10 мая 2011

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

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

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

0 голосов
/ 27 октября 2016

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

0 голосов
/ 11 мая 2011

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

0 голосов
/ 10 мая 2011

А как насчет динамического анализа? Если вы можете отладить вашу программу, вы можете установить исключение точки останова из представления точек останова. Это маленькая кнопка с «!» и 'J' на нем, и он сломается всякий раз, когда выбрасывается исключение, о котором вы заботитесь. Тогда вы можете шагнуть, чтобы увидеть, где он пойман.

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

0 голосов
/ 10 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...