Java Swing GUI中的异常处理

Java Swing GUI中的异常处理,java,swing,exception,exception-handling,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 in

我不确定如何在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应用程序中有更好的方法来实现这一点吗

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


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

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

您可以考虑在<代码> joptPANGE< /COD>上的一些定制/抽象类,如果您想:< /P>
至于以相同的方式处理多个异常,如果消息在所有3个
KnownBusinessException
s和
KnownDataAccessException
s中都是相同的,那么您可以确保两个类具有相同的父级并捕获该类。如果对
KnownBusinessException
s而不是
knowndaaccessexception
s需要相同的处理,则将所有
KnownBusinessException
s与相同的父项和所有
knowndaaccessexception
s与相同的父项进行处理。。希望你明白我的意思。

我认为最好是显式捕获所有已检查的异常,并为其余的安装一个未检查的异常处理程序。见此:

以下是我如何使用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”技巧是不必要的,在Java7中不起作用。对于Java 7,只需使用标准Thread.setDefaultUncaughtExceptionHandler,如上所述。当然,如果您同时使用这两种机制来注册异常处理程序,那么代码将在所有版本中工作


顺便说一句,如果引发未捕获的异常(但您的应用程序可能仍处于不一致的状态),EDT线程将自动重新启动,请参见:

查看此错误,以查找可能重复的@BheshGurung,我已经读过它。如果没有问题,我想我会在RuntimeException catch块之后添加另一个catch块,以便捕获错误并在退出之前通知用户。@垃圾神:这对我来说似乎不是重复:)+1用于提及
UncaughtExceptionHandler
。在您的代码中包含以下内容确实是一件好事:)@lbalazscs:谢谢,但我不明白handleException(e)应该做什么。这是处理运行时异常(例如日志)的常用方法吗?如果我想对RuntimeException的不同子类采取不同的操作,这取决于引发的异常以及导致该异常的用户的操作。在我看来,运行时异常不是由用户操作引起的,而是由程序员错误引起的:)在GUI中,我会显示异常消息,可能带有堆栈跟踪,我会要求用户与开发者联系并提供这些信息。SwingX中的JXerorPane类实现了这一点。但是你可以做任何你想做的事情,包括检查异常的确切类别。是的,这也是我的观点,我表达得很糟糕:我的意思是用户单击
按钮1
,此操作会导致运行时异常(由于编程错误(例如NPE)或其他原因(例如DataAccessException))。显然,用户不对该异常负责,但我想根据他是否在
ViewX
中按下了
Button1
,还是在
ViewY
:)中按下了
Button2
)而采取不同的行动
handleException(e)
方法是否可能?在我看来,情况并非如此:(我在想,也许我可以将
UncaughtExceptionHandler
仅用于泛型
RuntimeException
s,这应该以一种非常标准的方式进行处理(我想不出任何自定义方法,而且这也太过了)…或以相同方式处理的任何其他异常,可能只是参数化错误消息(例如,
DataAccessException
,我认为)。这里没有什么新的内容,我知道如何使用JOptionPane,如果我想以相同的方式处理多个异常,我肯定不会进行复制/粘贴。对不起,我误解了你的问题。@Ibalazscs的回答涉及
UncaughtExceptionHandler
满足了你的要求。在应用程序级别,你可以处理任何未被破坏的异常。说你想要什么要在屏幕级别实现这一点(您可能期望运行时异常发生,您应该为这些异常添加捕获。希望这有帮助:)