Estoy utilizando el enhebrado en la aplicación a través de la clase Swing Worker. Funciona bien, pero tengo un mal presentimiento al mostrar un diálogo de mensaje de error en el bloque try-catch. ¿Puede bloquear potencialmente la aplicación? Esto es lo que parece ahora:Manejo elegante de excepciones en 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");
}
};
¿Se puede hacer de una manera segura utilizando Swing Worker framework? ¿Está superando el método publish() una buena ventaja aquí?
EDIT:
hice así:
} 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);
}
});
}
Calling llegar en el método de hacerlo resultaría en dos bloques try-catch, como la parte de cálculo arroja excepciones, así que creo que esto es limpiador al final.
Manejarlo en el método done() es exactamente como he abordado esta situación en el pasado. invokeLater es una gran solución también. – jzd
sí y no demasiado, pero responda a la pregunta de OP +1 – mKorbel
1) Nunca he permitido que se ejecute ningún código que pueda arrojar Exception dentro de SwingWorker 2) PropertyChangeListener sería capturado como excepción de SwingWorker 3) todo parece como construir a lo grande problemas para ir de esta manera :-) – mKorbel