java - 在 Java 中捕获一个通用异常?

标签 java generics exception

我们在工作中使用 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 block 中使用通用异常类型。

如何解决 Java 限制?

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

最佳答案

您可以传入 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, //...

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

关于java - 在 Java 中捕获一个通用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024654/

相关文章:

java - 使用 apache httpclient 4 显示请求 header 时出现问题

java - 无法让此 Java 代码运行得更快

swift - Swift 中协议(protocol)和泛型的限制

c# - PropertyInfo.SetValue() 不工作但没有错误

c++ - 我可以直接调用 std::terminate 吗?

java - 来自子布局的 recyclerView 引用,包含在父布局中的 <include/>

java - 如何在 Criteria API(JPA) 中获取单列的不同值

java - 从命令行进行 Junit 测试 无可运行方法异常

c# - 将类型的通用容器转换为继承类型的容器?

java - 最佳实践——异常处理