在Java中捕获一般的异常?

Ale*_*sky 35 java generics exception

我们在工作中使用JUnit 3并且没有ExpectedException注释.我想在我们的代码中添加一个实用程序来包装它:

 try {
     someCode();
     fail("some error message");
 } catch (SomeSpecificExceptionType ex) {
 }
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这个:

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

但是,我认为Java不能在catch块中使用泛型异常类型.

我怎么能做这样的事情,解决Java限制?

有没有办法检查ex变量是否类型T

Mar*_*ers 29

您可以传递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, //...
Run Code Online (Sandbox Code Playgroud)

我不确定你是否想要重新抛出; 重新抛出同样会失败/错误测试但在语义上我不会,因为它基本上意味着"我们没有得到我们预期的异常",因此这代表编程错误,而不是测试环境错误.