swing 未捕获的异常处理程序

2023-12-13

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

我在 jython 中工作(python 语法被编译为 java 并执行)。我的代码看起来大致是这样的(updated):

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 脚本。

我发现测试环境和生产环境之间的主要区别在于,在生产环境中,swing 线程已全部启动(第三方应用程序利用 swing)。这是否会导致我的ThreadGroup设置失败,或者还有其他原因导致此功能不起作用?

我怎样才能让涉及的线程(由于buttonActions引发的异常)来检查它们的defaultException处理程序?如果(我担心)第三方安装了自己的处理程序(所有异常都写入日志文件),我怎样才能创建一个新的 Swing 工作线程? (毕竟我不想捕获主机应用程序创建的异常)

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

Update: 考虑到来自的答案lbalazscs我正在尝试使用sun.awt.exception.handler属性,但它没有任何作用,异常仍然最终出现在日志文件中(应用程序默认行为)。我用得对吗? (注:我使用的是Java 1.6)


如果您有 Java 5 或更高版本,您还可以使用 Thread.setDefaultUncaughtExceptionHandler(),这在较新的“Java Specialists' Newsletter”中也有描述:

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

这是最新的 Java 7 版本:

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

另请参阅此:为什么要费心设置“sun.awt.exception.handler”属性?

编辑:这就是我使用Thread.setDefaultUncaughtExceptionHandler的方式(在Java中......):

public static void setupGlobalExceptionHandling() {
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            handleException(e);
        }
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swing 未捕获的异常处理程序 的相关文章

随机推荐