JavaFX - 在一个地方处理异常

时间:2016-02-25 09:56:16

标签: javafx

我正在研究JavaFX应用程序,我想知道是否有办法在一个地方处理异常。

我正在插入数据库。当插入失败时,我得到一个SQLException。

那么,是否可以在一个地方处理所有SQLExceptions(对于所有插入)?

我知道:

Thread.setDefaultUncaughtExceptionHandler(...);

但这可能不是要走的路?

1 个答案:

答案 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(...);是不可行的方式。