有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

NetBeans环境中的java捕获EDT异常

我想捕获所有未捕获的异常并打开一个对话框。首先,我从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之外抛出的异常。我读过关于ThreadGroup的文章,但我不能使用这个解决方案,因为我们在Maven中使用NetBeans,所以我不能用ThreadGroup包装开始线程。来自1.7之前版本的黑客攻击也不再可能,覆盖EventQueue也没有效果

我尝试过很多解决方案,但都不奏效。有没有人能为我提供另一个可行的解决方案

提前谢谢

蒂兹尔


共 (1) 个答案

  1. # 1 楼答案

    在我自己的项目中,我已经将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 {
    
        }
    }
    

    另见组织。netbeans。果心NbErrorManager和org。netbeans。果心NotifyExcPanel了解NetBeans如何使用默认处理程序

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