我有一种方法可以在超时的情况下执行某些任务。我使用 ExecutorServer.submit() 来获取 Future 对象,然后我调用 future.get() 并超时。这工作正常,但我的问题是处理我的任务可能引发的已检查异常的最佳方法。以下代码有效,并保留了已检查的异常,但如果方法签名中的已检查异常列表发生更改,它似乎非常笨拙并且容易中断。
对于如何解决这个问题,有任何的建议吗?我需要以 Java 5 为目标,但我也很想知道在较新版本的 Java 中是否有好的解决方案。
public static byte[] doSomethingWithTimeout( int timeout ) throws ProcessExecutionException, InterruptedException, IOException, TimeoutException {
Callable<byte[]> callable = new Callable<byte[]>() {
public byte[] call() throws IOException, InterruptedException, ProcessExecutionException {
//Do some work that could throw one of these exceptions
return null;
}
};
try {
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Future<byte[]> future = service.submit( callable );
return future.get( timeout, TimeUnit.MILLISECONDS );
} finally {
service.shutdown();
}
} catch( Throwable t ) { //Exception handling of nested exceptions is painfully clumsy in Java
if( t instanceof ExecutionException ) {
t = t.getCause();
}
if( t instanceof ProcessExecutionException ) {
throw (ProcessExecutionException)t;
} else if( t instanceof InterruptedException ) {
throw (InterruptedException)t;
} else if( t instanceof IOException ) {
throw (IOException)t;
} else if( t instanceof TimeoutException ) {
throw (TimeoutException)t;
} else if( t instanceof Error ) {
throw (Error)t;
} else if( t instanceof RuntimeException) {
throw (RuntimeException)t;
} else {
throw new RuntimeException( t );
}
}
}
=== 更新 ===
许多人发布的回复建议 1)作为一般异常重新抛出,或 2)作为未经检查的异常重新抛出。我不想做这些,因为这些异常类型(ProcessExecutionException、InterruptedException、IOException、TimeoutException)很重要——它们各自将被处理的调用以不同的方式处理。如果我不需要超时功能,那么我希望我的方法抛出这 4 种特定的异常类型(好吧,TimeoutException 除外)。我不认为添加超时功能应该改变我的方法签名来抛出一个通用的异常类型。