7

我不确定如何在 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 块中有要捕获的已检查异常,是嵌套 try/catch 还是在捕获 RuntimeException 后捕获这些已检查异常更好?(这可能取决于,我什至不知道这是否会发生顺便说一句)

另一件事:Errors呢?如果我是用户,我不希望遇到意外关闭,我更希望应用程序告诉我发生了令人难以置信的错误并且没有人可以对此做任何事情,“世界末日即将来临,所以我将立即退出”。至少我会知道这不是我的错,哈哈。

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

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

4

3 回答 3

11

我认为最好的方法是显式捕获所有已检查的异常,并为其余的安装未捕获的异常处理程序。看到这个:如何检测何时在 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。当然,如果您同时使用这两种机制来注册异常处理程序,那么代码将适用于所有版本。

顺便说一句,如果抛出未捕获的异常(但您的应用程序可能保持不一致的状态),EDT 线程会自动重新启动,请参阅:EDT 和运行时异常

于 2012-09-09T18:21:13.263 回答
0

向用户显示出错的一个好方法是使用JOptionPanes。再加上对图标的良好使用(信息/错误),您就可以开始了。以下是一些示例代码供您参考:

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

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

至于以相同的方式处理多个异常,如果消息在所有 3KnownBusinessExceptionKnownDataAccessExceptions 中都相同,那么您可以确保两个类具有相同的父级并捕获一个类。如果KnownBusinessExceptions 而不是KnownDataAccessExceptions 需要相同的处理,则所有KnownBusinessExceptions 都具有相同的父级,所有KnownDataAccessExceptions 都具有相同的父级。希望你能得到我想要的结果。

于 2012-09-09T18:16:23.437 回答
0

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

就像您说的那样,这取决于在捕获异常后执行 try 块中的其余代码是否有意义。如果不是,那么嵌套 try/catch 块就没有意义了。

于 2012-09-09T18:14:03.373 回答