2012-08-17 62 views
2

我想这里描述构建一个通用的异常处理程序的Swing应用程序:http://www.javaspecialists.eu/archive/Issue081.html摆动的UncaughtExceptionHandler

我的工作中的Jython(Python语法入门编译成Java和执行)。我的代码看起来大致是这样的(更新):

def launcher(func): 
    class launcherThread(Runnable): 
     def __init__(self): 
      super(launcherThread, self).__init__() 

     def run(self): 
      func() 

    #trying to get the name which can be used to instantiate this in java 
    cls = ExceptionGroup().getClass() 
    fullName = cls.__module__ + '.' + cls.__name__ 

    System.setProperty("sun.awt.exception.handler", fullName) 
    Thread(ExceptionGroup(), launcherThread(), 'Cross ExceptionHandlerThread').start() 

class ExceptionGroup(ThreadGroup): 
    def __init__(self): 
     super(ExceptionGroup, self).__init__("HardenedGroup") 

    def uncaughtException(self, thread, exception): 
     #make a fancy dialog displaying str(exception) 

如果我测试它,它工作正常但是在生产enviornment它failes。 为了进行测试,我在Eclipse(PyDev)中启动了我的程序,生产环境是一个用Java编写的第三方应用程序,它有一个Jython控制台。应用程序支持添加自定义菜单条目,并将jython脚本放在这些条目上。

我在测试和生产环境之间看到的主要区别是在生产环境中,摆动线程已经准备就绪(第三方应用程序利用摆动)。这是否会导致我的ThreadGroup设置失败,或者有其他原因导致此问题无法解决?

如何获取相关线程(作为buttonAction的结果抛出异常)来检查它们的defaultException处理程序?如果(正如我担心的那样)应该证明第三方安装了自己的处理程序(所有异常都写入了日志文件),我该如何创建一个新的swing工作线程? (我不希望赶上毕竟由主机应用程序创建的例外)

问题回顾: 1.我如何检查哪些线程开始为传递到launcher函数的函数func看到thier未捕获的异常处理程序? 2.我可以为我的gui部分和主要应用程序gui部分强制执行一个单独的swing调度程序吗? (如果我在我的加入框中退出OnClos,第三方应用程序关闭)?

更新: 考虑anwser从lbalazscs我试图使用sun.awt.exception.handler属性,但它没有任何效果,例外还是在日志文件(应用程序dfeault行为)结束。我是否正确使用它? (PS:我在Java 1.6的)

回答

4

如果你有Java 5或更高,你也可以使用Thread.setDefaultUncaughtExceptionHandler(),这也是在一个较新的 “Java专家时事通讯” 中描述:

http://www.javaspecialists.eu/archive/Issue089.html

这里是最新的Java版本7:

http://www.javaspecialists.eu/archive/Issue196.html

也看到这一点: Why bother with setting the "sun.awt.exception.handler" property?

编辑:这是我如何使用Thread.setDefaultUncaughtExceptionHandler(在Java中...):

public static void setupGlobalExceptionHandling() { 
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      handleException(e); 
     } 
    }); 
} 
+0

由于我使用的Java 6我假设你在正确的方向我。然而,我现在有另一个问题,我不能让“sun.awt.exception.handler”porperty工作。我更新了代码,但它没有效果(请参阅更新后的问题)。因为我试图从不同线程(包括edt)捕获未处理的异常,所以'setDefaultUncaughtExceptionHandler()'似乎不适合我。 – ted 2012-08-20 08:40:08

+1

使用Thread.setDefaultUncaughtExceptionHandler,您可以为所有线程设置未捕获的异常处理(是一种静态方法)。看到我更新的答案。 – lbalazscs 2012-08-20 09:45:56

+0

非常感谢,这仍然留下属性问题(我需要设置它我猜),但我不认为它会导致任何影响(异常仍然通过我的异常处理程序并运行默认方式),... – ted 2012-08-20 10:04:13