Поймать универсальное исключение в Java?

Мы используем JUnit 3 на работе и существует нет ExpectedException аннотация. Я хотел добавить утилиту к нашему коду для обертывания этого:

 try {
     someCode();
     fail("some error message");
 } catch (SomeSpecificExceptionType ex) {
 }

Таким образом, я попробовал это:

public static class ExpectedExceptionUtility {
  public static <T extends Exception> void checkForExpectedException(String message, ExpectedExceptionBlock<T> block) {
     try {
        block.exceptionThrowingCode();
        fail(message);
    } catch (T ex) {
    }
  }
}

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

Как я могу сделать что-то вроде этого, работающее вокруг ограничения Java?

Есть ли способ проверить что ex переменная имеет тип T?

35
задан BalusC 11 June 2010 в 16:57
поделиться

4 ответа

Вы можете передать объект Class и проверить это программно.

public static <T extends Exception> void checkForException(String message, 
        Class<T> exceptionType, ExpectedExceptionBlock<T> block) {
    try {
       block.exceptionThrowingCode();
   } catch (Exception ex) {
       if ( exceptionType.isInstance(ex) ) {
           return;
       } else {
          throw ex;  //optional?
       }
   }
   fail(message);
}

//...
checkForException("Expected an NPE", NullPointerException.class, //...

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

29
ответ дан 27 November 2019 в 15:44
поделиться

Я понимаю порыв попытаться упростить вашу идиому исключения-теста, но серьезно: не надо. Все возможные варианты, которые вы придумаете, - это лекарство, которое хуже болезни. Особенно ерунда с @ExpectedException в JUnit 4! Это слишком умное рамочное решение, требующее от каждого изучать, как оно работает, в отличие от простого самоочевидного бита обычного кода Java. Хуже того, он не дает вам возможности обернуть только ту часть вашего теста, которая, как вы ожидаете, вызовет исключение, так что если более ранний шаг установки вызовет то же самое исключение, ваш тест пройдет, даже если ваш код сломан.

Я мог бы написать длинную диатрибу об этом здесь (извините, что у меня не хватает времени), поскольку мы долго обсуждали этот вопрос среди Java-инженеров в Google, и все сошлись на том, что ни одно из этих безумных решений не стоит того. Привыкайте к try/catch, это действительно не так уж плохо.

4
ответ дан 27 November 2019 в 15:44
поделиться

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

0
ответ дан 27 November 2019 в 15:44
поделиться

Вы также можете использовать IDE, которая поддерживает живой шаблон (например, IntellJ IDEA например) и назначить ярлык типа ee -> [tab], который вставит try/catch/ignore для вас и позволит вам ввести правильный.

like this

like this

0
ответ дан 27 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: