在NetBeans环境中捕获EDT异常

时间:2014-03-17 15:21:54

标签: java maven netbeans exception-handling event-dispatch-thread

我希望捕获所有未捕获的异常并启动对话框。首先,我从NetBeans中删除了默认的异常处理程序,并将我的处理程序添加为默认处理程序:

java.util.logging.Logger global = java.util.logging.Logger.getLogger("");
for (Handler handler : global.getHandlers()) {
  if (handler.getClass().getName().equals("org.netbeans.core.startup.TopLogging$LookupDel"))
  {
    global.removeHandler(handler);
    break;
  }
}
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());

处理程序如下所示:

public static final class ExceptionHandler implements UncaughtExceptionHandler
{

  @Override
  public void uncaughtException(Thread thread, Throwable throwable)
  {
    logger.error(throwable.getMessage(), throwable);
    ExceptionViewPanel.showException(throwable);
  }
}

使用该构造,我只能捕获在EDT之外抛出的异常。我读过有关ThreadGroups的内容,但由于我们将NetBeans与Maven一起使用,因此无法使用该解决方案,因此我无法使用ThreadGroup包装启动线程。来自1.7之前的黑客攻击也不再可能,并且覆盖EventQueue也没有效果。

我尝试过很多解决方案,但都没有。有没有人为我提供另一种可能有用的解决方案?

提前致谢

Teazl

1 个答案:

答案 0 :(得分:0)

在我自己的项目中,我已经取代了我自己的NetBeans错误处理程序。我的例子:

@ServiceProvider(service = Handler.class, supersedes = "org.netbeans.core.NbErrorManager")
public class MyHandler extends Handler {
    @Override
    public void publish(LogRecord record) {
        if (record.getThrown() != null) {
            record.getThrown(); // do with it something
        }
    }

    @Override
    public void flush() {

    }

    @Override
    public void close() throws SecurityException {

    }
}

另请参阅org.netbeans.core.NbErrorManager和org.netbeans.core.NotifyExcPanel以了解NetBeans如何使用默认处理程序。

您只需要在项目中添加此类。