我在通过Swing Worker类的应用程序中使用线程。它工作正常,但我有一个不好的感觉,显示try-catch块中的错误消息对话框。它可能会阻止应用程序?这是它看起来现在: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");
}
};
它可以使用的Swing工作器框架安全的方式来完成?在这里重写publish()方法是一个好主意吗?
编辑:
难道这样的:
} 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);
}
});
}
调用get中完成的方法将导致两个的try-catch块,如计算部分抛出异常,所以我认为这是清洁剂。
在done()方法中处理它正是我过去如何处理这种情况。 invokeLater也是一个很好的解决方案。 – jzd
是和不是太,但回答OP的问题+1 – mKorbel
1)我永远不会允许运行任何代码,可以抛出异常内部SwingWorker 2)PropertyChangeListener将捕获任何从SwingWorker exeption 3)所有看起来像建设大麻烦去这样:-) – mKorbel