我正在尝试为摆动应用程序构建一个通用异常处理程序,如下所述: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 脚本放在这些条目上。
我看到的测试环境和生产环境之间的主要区别在于,在生产环境中,swing 线程已经启动(第三方应用程序使用了 swing)。这会导致我的ThreadGroup
设置失败,还是有其他原因导致它不起作用?
如何让参与的线程(由于 buttonActions 引发异常)来检查它们的 defaultException 处理程序?如果(我担心)应该证明第三方安装了自己的处理程序(所有异常都写入日志文件),我该如何创建一个新的 Swing 工作线程?(毕竟我不想捕获宿主应用程序创建的异常)
问题回顾: 1. 如何检查为func
传递给 launcher
函数的函数启动了哪些线程并查看其未捕获的异常处理程序?2. 我可以为我的 gui 部分和主要应用程序 gui 部分强制执行单独的 swing 调度程序吗?(如果我在插件的框架上退出OnClos,第三方应用程序将关闭)?
更新:考虑到lbalazscs
我正在尝试使用该sun.awt.exception.handler
属性的 anwser,但它没有效果,异常仍然会出现在日志文件中(应用程序 dfeault 行为)。我用对了吗?(ps:我在 Java 1.6 上)