我想使用自定义异常来在发生任何类型的异常时出现用户友好的消息。
这样做的好方法是什么?我应该采取什么额外的预防措施来避免干扰 Swing 的 EDT?
异常翻译:
最好不要使用对最终用户没有意义的消息来污染您的应用程序,而是创建有意义的异常和消息,这些异常和消息将转换在应用程序实现深处发生的异常/错误。
根据@Romain 的评论,您可以使用Exception(Throwable Cause)构造函数来跟踪较低级别的异常。
来自Effective Java 2nd Edition
,第 61 项:
[...] 较高层应该捕获较低级别的异常,并在它们的位置抛出异常,这些异常可以用较高级别的抽象来解释。这个成语被称为异常翻译:
// Exception Translation
try {
// Use lower-level abstraction to do our bidding
...
} catch(LowerLevelException e) {
throw new HigherLevelException(...);
}
您可以使用java.lang.Thread.UncaughtExceptionHandler
which 捕获您自己不关心的所有异常
import java.lang.Thread.UncaughtExceptionHandler;
public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
Frame.showError("Titel", "Description", e, Level.WARNING);
e.printStackTrace();
}
}
在您的应用中注册它:
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
}
在您的 GUI 中,您可以使用org.jdesktop.swingx.JXErrorPane
SwingX显示一个不错的错误弹出窗口,通知用户有关异常的信息。
public static void showError(String title, String desc, Throwable e,
Level level) {
JXErrorPane.showDialog(this, new ErrorInfo(title,
desc, null, null, e, level, null));
}