Подтвердить что ты не робот

Поймать общее исключение в 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 не может использовать общие типы исключений в блоке catch.

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

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

4b9b3361

Ответ 1

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

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, //...

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

like this

like this

Ответ 6

Генерики не являются типами. Это не шаблоны. Они выполняют проверку типа времени компиляции на Java. Блоки исключений улавливают тип. Вы можете поймать (исключение e) или даже поймать (Throwable e), а затем бросить по мере необходимости.