摆动uncaughtexceptionhandler

时间:2012-08-17 15:25:25

标签: swing exception jython

我正在尝试为swing应用程序构建一个常规异常处理程序,如下所述:http://www.javaspecialists.eu/archive/Issue081.html

我在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)

如果我测试它,它可以正常工作,但在生产环境中它很容易。 为了测试我在Eclipse(PyDev)中启动我的程序,生产环境是用Java编写的第三方应用程序,它内置了一个Jython控制台。该应用程序支持添加自定义菜单项,并将jython脚本放在这些上。

我在测试和生产环境之间看到的主要区别在于,在生产环境中,摆动线程已经全部启动(第三方应用程序利用了摆动)。这是否会导致我的ThreadGroup设置失败,还是有其他原因导致无效?

如何获取Involved线程(由于buttonActions而抛出的异常)来检查它们的defaultException处理程序?如果(我害怕)它应该证明第三方安装了自己的处理程序(所有异常都写入日志文件)如何创建一个新的swing工作线程? (毕竟,我不想捕获主机应用程序创建的异常)

问题回顾: 1.如何检查传递给func函数的函数launcher的哪些线程,并查看未捕获的异常处理程序? 2.我可以为我的gui部分和主要应用程序gui部分强制执行单独的摇摆调度程序吗? (如果我在添加的框架上退出,则第三方应用程序关闭)?

更新: 考虑来自lbalazscs的anwser我试图使用sun.awt.exception.handler属性,但它没有效果,异常仍然在日志文件中结束(应用程序dfeault行为)。我用它了吗? (p.s:我在Java 1.6上)

1 个答案:

答案 0 :(得分: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);
        }
    });
}