我正在研究JavaFX应用程序,我想知道是否有办法在一个地方处理异常。
我正在插入数据库。当插入失败时,我得到一个SQLException。
那么,是否可以在一个地方处理所有SQLExceptions(对于所有插入)?
我知道:
Thread.setDefaultUncaughtExceptionHandler(...);
但这可能不是要走的路?
答案 0 :(得分:1)
在JavaFX应用程序线程中直接调用执行SQL查询(或任何其他可能需要很长时间才能执行的业务逻辑)的代码是不好的做法。 (我观察到,在Windows JavaFX应用程序崩溃时,如果在应用程序线程中抛出未捕获的exeption,则甚至不打印堆栈跟踪。)
我建议使用javafx.concurrent.Task
调用与SQL相关的代码。
使用setOnFailed()
方法,只要抛出Execption,就可以调用代码。在那里,您可以查找异常类型并调用处理SQLException
的任何方法。
Task<SOME_TYPE> mySqlTask = new Task<>() {
@Override
protected SOME_TYPE call() throws Exception {
... // do sql stuff
return mySqlResult; // or null if not needed
}
};
mySqlTask.setOnFailed(event -> {
Throwable exception = mySqlTask.getException();
if (exception instanceof SQLException) {
// call code that handles the sql exception
}
});
// start the task in a separate thread (or better use an Executor)
new Thread(mySqlTask).start();
顺便说一句,我不认为使用Thread.setDefaultUncaughtExceptionHandler(...);
是不可行的方式。