リビジョン | 221 (tree) |
---|---|
日時 | 2020-07-13 13:43:14 |
作者 | hirukawa_ryo |
* fx-util 0.3.7
Asyncで発生した検査例外を強制スローする方法をやめて、AsyncWrappedExceptionでラップしてスローする処理に戻しました。
JavaFXの非同期タスクで検査例外をそのままスローしてもPrivilegedActionExceptionでラップされたままになりあまり意味がないためです。
また、スレッドのUncaughtExceptionHandlerを確認してUncaughtExceptionHandlerが設定されている場合は直接 uncaughtExceptionを呼ぶようにしました。
この場合は、AsyncWrappedExceptionでラップされていない元の検査例外をuncaughtExceptionメソッドが受け取ります。
なお、Silent~で発生した例外はthrows句なしで検査例外のままスローする方法のままです。
@@ -168,7 +168,12 @@ | ||
168 | 168 | } |
169 | 169 | } |
170 | 170 | if(exception != null) { |
171 | - rethrow(exception); | |
171 | + Thread.UncaughtExceptionHandler ueh = Thread.currentThread().getUncaughtExceptionHandler(); | |
172 | + if(ueh != null) { | |
173 | + ueh.uncaughtException(Thread.currentThread(), exception); | |
174 | + } else { | |
175 | + throw new AsyncWrappedException(exception); | |
176 | + } | |
172 | 177 | } |
173 | 178 | } |
174 | 179 | } |
@@ -194,7 +199,12 @@ | ||
194 | 199 | } |
195 | 200 | } |
196 | 201 | if(exception != null) { |
197 | - rethrow(exception); | |
202 | + Thread.UncaughtExceptionHandler ueh = Thread.currentThread().getUncaughtExceptionHandler(); | |
203 | + if(ueh != null) { | |
204 | + ueh.uncaughtException(Thread.currentThread(), exception); | |
205 | + } else { | |
206 | + throw new AsyncWrappedException(exception); | |
207 | + } | |
198 | 208 | } |
199 | 209 | } |
200 | 210 | } |
@@ -224,7 +234,12 @@ | ||
224 | 234 | } |
225 | 235 | } |
226 | 236 | if(exception != null) { |
227 | - rethrow(exception); | |
237 | + Thread.UncaughtExceptionHandler ueh = Thread.currentThread().getUncaughtExceptionHandler(); | |
238 | + if(ueh != null) { | |
239 | + ueh.uncaughtException(Thread.currentThread(), exception); | |
240 | + } else { | |
241 | + throw new AsyncWrappedException(exception); | |
242 | + } | |
228 | 243 | } |
229 | 244 | } |
230 | 245 | } |
@@ -317,13 +332,4 @@ | ||
317 | 332 | public interface Complete { |
318 | 333 | void onCompleted(State state) throws Exception; |
319 | 334 | } |
320 | - | |
321 | - static void rethrow(Throwable throwable) { | |
322 | - rethrow0(throwable); | |
323 | - } | |
324 | - | |
325 | - @SuppressWarnings("unchecked") | |
326 | - static <T extends Throwable> void rethrow0(Throwable throwable) throws T { | |
327 | - throw (T)throwable; | |
328 | - } | |
329 | 335 | } |
@@ -0,0 +1,8 @@ | ||
1 | +package net.osdn.util.javafx.concurrent; | |
2 | + | |
3 | +@SuppressWarnings("serial") | |
4 | +public class AsyncWrappedException extends RuntimeException { | |
5 | + public AsyncWrappedException(Exception cause) { | |
6 | + super(cause); | |
7 | + } | |
8 | +} |