これは古い投稿ですが、いくつか明確にしたいと思います。
SwingWorker.get は、InterruptedException、ExecutionException をチェック例外としてスローします。
さらに、CancellationException という非常に具体的な未チェックの例外をスローします。もちろん、チェックされていない例外をスローする可能性はありますが、CancellationException は「例外的」で予期しないものではありません。キャンセル後に get メソッドを呼び出そうとするとスローされます。
doInBackground 内で例外がスローされると、ExecutedException がスローされます。元の例外は、ExecutionException 内にラップされます。get() メソッドが呼び出されると、ExecutionException がスローされます。元の例外を取り出して管理するというアイデアは良いです。(Emil Hが指摘したように)。
CancellationException はチェックされておらず、私の意見ではチェックする必要があります。API 実装がチェックされていない唯一の言い訳は、ステータス メソッド isCancelled() があることです。
次のいずれかを実行できます:
- isCancelled() をテストし、true の場合は get() を呼び出さないでください。CancellationException がスローされるためです
- get() を try-catch で囲み、CancellationException を追加します
。 CancellationException はチェックされていないので、そのすべてを忘れて、素晴らしい驚きを得ることができます。
-ワーカーをキャンセルしないため、何でもします
中断された例外。cancel(true) で SwingThread をキャンセルすると、doInBackground の最初の割り込み可能なメソッド呼び出し (確かに Thread.sleep、this.wait、おそらくいくつかの IO メソッド) で InterruptException がスローされます。ただし、この例外は ExecuteException にラップされません。doInBackground は、中断された例外で終了するために残されます。それがキャッチされて他の例外に変換された場合、それらは無視されます。これは、この時点で cancel が EDT で SwingThread.done を既に呼び出しており、done が get を呼び出した場合、標準の CancellationException だけを取得しているためです。InterruptedException ではありません。
cancel(false) でキャンセルすると、doInBackground 内で InterruptException は発生しません。cancel(true) でキャンセルした場合も同じですが、doInBackground 内に割り込み可能なメソッド呼び出しはありません。これらの場合、doInBackground はその自然なループに従います。このループは isCancelled メソッドをテストし、正常に終了する必要があります。doInBackground がそうしない場合、永久に実行されます。タイムアウトの存在についてはテストしていませんが、そうは思いません。
私にとっては、グレーゾーンのままです。get によって InterruptedException がスローされるのはどのような場合ですか? 同様の例外を生成できなかったので、短いコードを見たいと思います。:-)
PS別の質問と回答で、キャンセルの場合の完了および状態変更リスナーがdoInBackgroundが終了する前に呼び出されることを文書化しました。これは事実であるため、これはバグではありませんが、doInBackground メソッドを設計する際には特別な注意が必要です。これに興味がある場合は、SwingWorker: 正確に done メソッドが呼び出されるのはいつですか?を参照してください。