javagenericsexception

Catch a generic exception in Java?


We use JUnit 3 at work and there is no ExpectedException annotation. I wanted to add a utility to our code to wrap this:

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

So I tried this:

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

However, Java cannot use generic exception types in a catch block, I think.

How can I do something like this, working around the Java limitation?

Is there a way to check that the ex variable is of type T?


Solution

  • You could pass the Class object in and check that programatically.

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

    I'm not sure if you'd want the rethrow or not; rethrowing would equally fail/error the test but semantically I wouldn't, since it basically means "we didn't get the exception we expected" and so that represents a programming error, instead of a test environment error.