Używam wątkowania w aplikacji za pośrednictwem klasy Swing Worker. Działa dobrze, ale mam złe przeczucie, że pokazuję okno dialogowe z komunikatem o błędzie w bloku try-catch. Czy może potencjalnie zablokować aplikację? Oto, na czym to teraz wygląda:Wyczerpujące obsługa wyjątków w Swing Worker
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
// Executed in background thread
public Void doInBackground() {
try {
DoFancyStuff();
} catch (Exception e) {
e.printStackTrace();
String msg = String.format("Unexpected problem: %s", e
.toString());
//TODO: executed in background thread and should be executed in EDT?
JOptionPane.showMessageDialog(Utils.getActiveFrame(),
msg, "Error", JOptionPane.ERROR_MESSAGE,
errorIcon);
}//END: try-catch
return null;
}
// Executed in event dispatch thread
public void done() {
System.out.println("Done");
}
};
Czy można to zrobić w bezpieczny sposób za pomocą struktury Swing Worker? Czy nadrzędna metoda publish() jest tutaj dobrym tropem?
EDIT:
Czy to tak:
} catch (final Exception e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
e.printStackTrace();
String msg = String.format(
"Unexpected problem: %s", e.toString());
JOptionPane.showMessageDialog(Utils
.getActiveFrame(), msg, "Error",
JOptionPane.ERROR_MESSAGE, errorIcon);
}
});
}
Wywołanie dostać w metodzie Sporządzono skutkowałoby w dwóch blokach try-catch, jako część obliczeniowa generuje wyjątki, więc myślę, że jest to czystsze w końcu.
Posługiwanie się nim w metodzie done() jest dokładnie tym, w jaki sposób podjąłem tę sytuację w przeszłości. invokeLater to również świetne rozwiązanie. – jzd
tak i nie, ale odpowiedź na pytanie OP +1 – mKorbel
1) Nigdy nie pozwalałem na uruchamianie żadnego kodu, który mógłby wyrzucić wyjątek w SwingWorker 2) PropertyChangeListener byłby złapać jakiekolwiek wyjątki od SwingWorker 3) wszystko wygląda jak budynek duży kłopoty idące w ten sposób :-) – mKorbel