タイムアウトのあるタスクを実行するメソッドがあります。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 を除く)。タイムアウト機能を追加しても、メソッド シグネチャが変更されて一般的な例外タイプがスローされるとは思いません。