在Swing GUI中处理异常

时间:2012-09-09 17:58:51

标签: java swing exception exception-handling

我不确定如何管理GUI中的异常;我的目标是让用户知道是否出现问题,显示出可理解的信息。

我正在考虑做这样的事情:

// I'm inside an actionPerformed() method
try {
    // do whatever I have to do here
} catch (KnownBusinessException1 e) {
    // inform the user and do something;
    // most times simply inform the user that it wasn't possible to complete the
    // operation and remain in the same window instead of moving forward.
} catch (KnownBusinessException2 e) {
    // just as above
} catch (KnownDataAccessException1 e) {
    // just as above
} catch (KnownDataAccessException2 e) {
    // just as above
} catch (RuntimeException e) { // I want to catch any other unexpected exception,
// maybe NPE or unchecked IllegalArgumentExceptions and so on
    // something went wrong, I don't know where nor how but I will surely inform the user
}

现在:如果在try块中有catch检查的异常,那么在捕获RuntimeException之后嵌套try / catch或捕获这些检查的异常会更好吗? (这可能取决于,我甚至不知道这是否会发生顺便说一句)

另一件事:Error s怎么样?如果我是一个用户,我不想经历意外关机,我更倾向于应用程序告诉我,某些事情发生了令人难以置信的错误,没有人可以对此做任何事情,“世界末日即将到来,所以我将立即退出“。至少我会知道那不是我的错。大声笑。

顺便说一下,不知道捕获错误是不是一个好习惯......:\

在Swing应用程序中有更好的方法吗?

3 个答案:

答案 0 :(得分:10)

我认为最好是明确捕获所有已检查的异常,并为其余的安装未捕获的异常处理程序。请参阅:How can I detect when an Exception's been thrown globally in Java?

这是我使用Thread.setDefaultUncaughtExceptionHandler:

的方式
public static void setupGlobalExceptionHandling() {
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            handleException(e);
        }
    });
}

请注意,许多SO帖子中提到的EDT线程的“sun.awt.exception.handler”技巧不是必需的,并且在Java 7中不起作用。对于Java 7,只需使用标准的Thread.setDefaultUncaughtExceptionHandler,如上所述以上。当然,如果您使用这两种机制来注册异常处理程序,则代码将适用于所有版本。

BTW,如果抛出未捕获的异常(但您的应用可能仍处于不一致状态),EDT线程会自动重启,请参阅:EDT and runtime exception

答案 1 :(得分:0)

  

如果在try块中有catch检查的异常,那么在捕获RuntimeException之后嵌套try / catch或捕获这些检查的异常会更好吗? (这可能取决于,我甚至不知道这是否会发生顺便说一句)

就像你说的那样取决于在捕获到异常后执行try块中的代码是否有意义。如果没有,则嵌套try / catch块是没有意义的。

答案 2 :(得分:0)

向用户显示出错的一个好方法是使用JOptionPane s。添加到图标的良好用法(信息/错误),你很高兴。以下是一些示例代码供您参考:

http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

如果您愿意,可以考虑JOptionPane上的一些自定义/抽象类。)

至于以相同方式处理多个异常,如果消息在所有3个KnownBusinessExceptionKnownDataAccessException中相同,那么您可以确保两个类具有相同的父级抓住那一堂课。如果KnownBusinessException s而不是KnownDataAccessException s需要相同的处理,请让所有KnownBusinessException具有相同的父级,并且所有KnownDataAccessException具有相同的父级。希望您到达我要去的地方。