【发布时间】:2015-10-26 11:11:05
【问题描述】:
我问了一个关于如何覆盖默认 Java 异常处理 here 的问题,并被告知答案 here。
现在的问题是:有没有一种方法可以将这个处理程序生成到所有线程,而无需在每个线程中显式声明?
我认为应该可以以某种方式获取所有线程,然后将它们绑定到异常处理程序?
【问题讨论】:
我问了一个关于如何覆盖默认 Java 异常处理 here 的问题,并被告知答案 here。
现在的问题是:有没有一种方法可以将这个处理程序生成到所有线程,而无需在每个线程中显式声明?
我认为应该可以以某种方式获取所有线程,然后将它们绑定到异常处理程序?
【问题讨论】:
使用Thread.setDefaultUncaughtExceptionHandler。正如javadoc 所说:
“通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统任何“默认”行为的线程处理未捕获异常的方式(例如记录到特定设备或文件)提供。”
显然,如果一个线程已经有一个(非默认)处理程序,那么它不会受到默认行为更改的影响。
我认为应该可以以某种方式获取所有线程,然后将它们绑定到异常处理程序?
这不是必须的……除非你想改变一个线程的非默认处理程序。如果确实需要这样做,可以通过遍历应用程序的ThreadGroup 层次结构找到所有线程。 (除非你的应用是沙盒的......)
编辑
可以使用this answer找到正在运行的应用程序的线程列表:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
【讨论】:
如果我没记错的话,你可以使用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)。
【讨论】:
Thread中有一个方法setDefaultUncaughtExceptionHandler
【讨论】: