繁体   English   中英

在Swing GUI中处理异常

[英]Handling exceptions in Swing GUI

我不确定如何管理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后捕获这些已检查的异常会更好吗? (这可能取决于,我甚至不知道这是否会发生顺便说一句)

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

顺便说一下,不知道抓错是不是一个好习惯......:

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

我认为最好是明确捕获所有已检查的异常,并为其余的安装未捕获的异常处理程序。 请参阅: 如何检测何时在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和运行时异常

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

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

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

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

如果你想:)你可以考虑一些关于JOptionPane自定义/抽象类

至于以相同的方式处理多个异常,如果消息在所有3个KnownBusinessExceptionKnownDataAccessException中都相同,那么您可以确保两个类具有相同的KnownDataAccessException级并捕获该类。 如果KnownBusinessException需要相同的处理而不是KnownDataAccessException ,那么所有的KnownBusinessException具有相同的父级,并且所有的KnownDataAccessException具有相同的父级。希望你能得到我的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM