Это старый пост, но я хочу сделать некоторые пояснения:
SwingWorker.get генерирует InterruptedException, ExecutionException как проверенные исключения.
Кроме того, он генерирует очень специфическое непроверенное исключение - CancellationException.
Конечно, он может потенциально генерировать любое непроверенное исключение, но CancellationException не является «исключительным» и неожиданным. Он выдается, когда вы пытаетесь вызвать метод get после того, как он был вызван отменить.
ExecutedException генерируется, когда исключение генерируется внутри doInBackground.
Исходное исключение заключено в исключение ExecutionException.
Когда будет вызван метод get (), будет выдано исключение ExecutionException.
Идея убрать оригинальное исключение и управлять этим хороша. (Как отметил Эмиль Н).
CancellationException не проверено и, по моему мнению, должно быть проверено.
Единственный повод для реализации API, чтобы он не был проверен, это то, что у него есть метод состояния isCancelled ().
Вы можете либо:
- проверить isCancelled (), и если true, НЕ вызывать get (), так как он выдаст исключение CancellationException
- окружить get () с помощью try-catch и добавить исключение CancellationException, которое, поскольку не проверено, не будет запрашиваться компилятором
- тот факт, что CancellationException не проверяется, позволяет вам забыть обо всем этом и получить приятный сюрприз.
- сделай что-нибудь, потому что ты не отменишь работника
InterruptedException. Если вы отмените SwingThread с помощью cancel (true), то первый прерывистый вызов метода (наверняка Thread.sleep, this.wait, возможно, некоторые методы ввода-вывода) в doInBackground вызовет InterruptException. Но это исключение не заключено в ExecuteException. DoInBackground оставлено завершаться с прерванным исключением. Если оно перехватывается и преобразуется в какое-то другое исключение, оно будет проигнорировано, потому что к этому моменту отмена уже вызвало SwingThread.done в EDT, а если сделано, вызвало get, оно получило только стандартное CancellationException. Не прерванное исключение!
Если вы отменяете с помощью cancel (false), исключение InterruptException не возникает внутри doInBackground.
То же самое, если вы отменяете с помощью cancel (true), но в doInBackground нет прерывистых вызовов методов.
В этих случаях doInBackground будет следовать естественному циклу. Этот цикл должен проверить метод isCancelled и завершить работу корректно.
Если doInBackground не делает этого, он будет работать вечно.
Я не проверял наличие таймаутов, но я не верю так.
Для меня это всего лишь серая область .
В каких случаях InterruptedException выбрасывается методом get? Я хотел бы увидеть некоторый короткий код, так как я не мог произвести подобное исключение. : -)
P.S.
В другом Вопросе и Ответе я задокументировал, что прослушиватель выполнения и изменения состояния в случае отмены вызывается до выхода doInBackground.
Поскольку это действительно так, это - не ошибка - требует особого внимания при разработке метода doInBackground. Если вы заинтересованы в этом, см. SwingWorker: когда именно вызывается метод done?