我想这里描述构建一个通用的异常处理程序的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的)
由于我使用的Java 6我假设你在正确的方向我。然而,我现在有另一个问题,我不能让“sun.awt.exception.handler”porperty工作。我更新了代码,但它没有效果(请参阅更新后的问题)。因为我试图从不同线程(包括edt)捕获未处理的异常,所以'setDefaultUncaughtExceptionHandler()'似乎不适合我。 – ted 2012-08-20 08:40:08
使用Thread.setDefaultUncaughtExceptionHandler,您可以为所有线程设置未捕获的异常处理(是一种静态方法)。看到我更新的答案。 – lbalazscs 2012-08-20 09:45:56
非常感谢,这仍然留下属性问题(我需要设置它我猜),但我不认为它会导致任何影响(异常仍然通过我的异常处理程序并运行默认方式),... – ted 2012-08-20 10:04:13