【问题标题】:Intercepting exceptions拦截异常
【发布时间】:2010-07-04 14:14:22
【问题描述】:

我想使用自定义异常来在发生任何类型的异常时显示用户友好的消息。

这样做有什么好的直接方法?我应该采取什么额外的预防措施来避免干扰 Swing 的 EDT?

【问题讨论】:

    标签: java swing exception intercept


    【解决方案1】:

    异常翻译:

    最好不要使用对最终用户没有意义的消息来污染您的应用程序,而是创建有意义的异常和消息,这些消息将翻译发生在某处深处的异常/错误应用的实现。

    根据@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(...);
        }
    

    【讨论】:

    • +1 只需确保将原始异常传递给新异常的构造函数,这样您就可以看到完整的堆栈跟踪以及原始原因。
    【解决方案2】:

    您可以使用java.lang.Thread.UncaughtExceptionHandler 捕获所有您自己不关心的异常

    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 中,您可以使用 SwingX 中的 org.jdesktop.swingx.JXErrorPane 来显示一个漂亮的错误弹出窗口,通知用户有关异常的信息。

    public static void showError(String title, String desc, Throwable e,
            Level level) {
        JXErrorPane.showDialog(this, new ErrorInfo(title,
                desc, null, null, e, level, null));
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 2010-09-18
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2014-07-19
      • 1970-01-01
      相关资源
      最近更新 更多