Обработка ошибок в SwingWorker

Мой вопрососнованный на теории вопрос, но он удовлетворяет конкретную потребность у меня.

Что вы делаете, когда ваш SwingWorker генерирует исключение, которое вы а) можете ожидать и б) восстановить и продолжить, но вы хотите уведомить пользователя о том, что произошла эта ошибка? Как вы получаете ожидаемое исключение и уведомляете пользователя, не нарушая "Нет кода Swing от "doInBackground() править?

С учетом этой проблемы я разработал SSCCE, который я хотел бы выдвинуть с вопросами ниже.

SSCCE:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Test {

    public static void main(String args[]) {
        final JFrame frame = new JFrame();
        JButton go = new JButton("Go.");
        go.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Task(frame);
            }
        });
        frame.add(go);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    static class Task extends SwingWorker {
        JFrame parent;
        JDialog dialog;
        public Task(JFrame parent) {
            this.parent = parent;
            dialog = new JDialog(parent);
            JProgressBar jpb = new JProgressBar();
            jpb.setIndeterminate(true);
            dialog.add(jpb);
            dialog.setLocationRelativeTo(null);
            dialog.setVisible(true);
            execute();
        }

        @Override
        protected Void doInBackground() throws Exception {
            for(int i = 0; i < 100000; i++) {
                System.out.println(i);
                try {
                    if(i == 68456) throw new IllegalStateException("Yikes! i = 68456.");
                } catch (final IllegalStateException e) {
                    SwingUtilities.invokeAndWait(new Runnable() {
                        @Override
                        public void run() {
                            JOptionPane.showMessageDialog(parent, "Error: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                        }
                    });
                }
            }
            return null;
        }

        @Override
        protected void done() {
            if (!isCancelled()) {
                try {
                    get();
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("done");
            dialog.dispose();
        }

    }
}

Это действительно, чтобы позвонитьSwingUtilities.invokeAndWait() в пределахdoInBackground() метод? Я сделал некоторые профилирование потоков по этому вопросу, и результаты были следующими:

Однажды "Идти" кнопка нажата,SwingWorker-pool-1-thread-1 нить идет зеленая. ТОГДА, когда условие if выполнено, выдается ошибка, и отображается диалоговое окно с сообщением об ошибке.желтыйи действительно есть зеленыйвсплеск» наAWT-EventQueue-0 поток, указывающий, что EDT был вызван. Я ждал около 10 секунд, нажал "Хорошо," иSwingWorker нить снова стала зеленой.

Есть ли потенциальные подводные камни, чтобы сделать что-то подобное? У кого-нибудь есть опыт уведомления пользователей об ошибках вычислений в режиме реального времени от? I 'SwingWorker

Буду честен, такой подход заставляет меня подозревать. Этокажется неортодоксально, но я не могу с уверенностью сказать, является ли это плохой идеей.

Ответы на вопрос(1)

Ваш ответ на вопрос