Как узнать, какое исключение выдается - PullRequest
10 голосов
/ 28 сентября 2011

Я делаю обзор для нашей кодовой базы, и есть много таких утверждений:

try
{
   doSomething()
} catch (Exception e)
{

}

, но я хотел бы узнать, какое исключение выдается doSomething () (нет броскаоператор в реализации doSomething), поэтому я могу поймать это исключение, а не просто перехватывать исключение в целом, даже с findBugs выдает предупреждение REC_CATCH_EXCEPTION.

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

Спасибо

Ответы [ 4 ]

15 голосов
/ 28 сентября 2011

Если в doSomething нет оператора throws (например, doSomething() throws IOException), любые возникшие исключения будут экземпляром RuntimeException.Если вы хотите узнать точный класс исключения, выдаваемого doSomething, вы всегда можете попробовать

try {
   doSomething();
} catch (RuntimeException e){
   System.out.println(e.getClass().getName());
}

Знать, какие исключения времени выполнения могут быть сгенерированы без фактического запуска программы, сложно.Даже если ни один из кодов, которые doSomething() вызывает, не имеет явного выброса, основные java-операции всегда могут выбросить NullPointerException, ArrayIndexOutOfBoundsException и т. Д. С неправильным вводом.Вот несколько идей:

  • Копать вручную.По крайней мере, вы будете знать некоторые исключения.
  • Используйте рефлексию, чтобы найти любые операторы throw, доступные из doSomething.
  • .Хорошие тесты покажут важные ошибки, к которым должны быть готовы абоненты doSomething.
  • Идите к людям, которые поставили улов на первое место

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

2 голосов
/ 28 сентября 2011

Вы можете 1) просмотреть весь код в doSomething () и все, что он вызывает, чтобы увидеть обработку исключений и то, что RuntimeExceptions может быть сгенерировано, или 2) взять catch (Exception e) и дождаться его сбоя. Это проблема, которую пытались преодолеть проверенные исключения, сделав строго типизированное объявление в сигнатурах методов о том, какие исключения должны обрабатываться в результате вызова метода.

0 голосов
/ 28 сентября 2011

Хотите ли вы ловить только исключения во время компиляции или во время выполнения?Если вы хотите отлавливать только те, что были во время компиляции, просто удалите свой текущий блок catch - вы сразу получите сообщения об ошибках, указывающие, что определенные исключения не перехватываются.После добавления одного исключения вы увидите сообщения об ошибках для других - вы сможете завершить перехват всех возможных исключений, выдаваемых вашим блоком кода.

0 голосов
/ 28 сентября 2011

Если нет условия throws, то метод не выбрасывает любое выполнение проверено . Javadoc этого метода может дать информацию о любых непроверенных исключениях, которые метод может выдать, но это не обязательно.

Почему вы хотите поймать какие-либо исключения в первую очередь?

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