我有办法完成一些任务,时间不长。 我利用ExecutorServer.submit()获得未来物体,然后我用时间说出未来。 这是很出色的工作,但我的问题是处理我的任务可以推翻的核查例外的最佳办法。 下面的法典是行之有效的,保留了所核查的例外情况,但是,如果在方法签字改动中列举的经核实的例外情形,这似乎极为模糊,很容易打破。
关于如何确定这一点的任何建议? 我需要针对贾瓦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 );
}
}
}
== UPDATE ==
许多人张贴了建议1的答复,作为一般例外重新增长,或2)作为不受制约的例外重新增长。 我不想做其中任何一个,因为这些例外类型(ProcessExecutionException, InterruptedException, IOException, TimeException)都很重要,它们都将通过处理电话处理。 如果我不需要时间,那么我就想把这四种特定例外类型(除了时间外,还有时间外)。 我并不认为,增加一个时间外观特征应改变我的签名方法,以 throw弃一种通用的例外情况。