线程中未捕获异常(UncaughtExceptionHandler)

Thread#run方法是不抛出任何检查型异常(Checked Exception),但是它自身却可能因为一个异常而被终止,导致这个线程的终结。
最麻烦的是,在线程中抛出的异常即使在主线程中使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。
主线程之所以不处理子线程抛出的RuntimeException,是因为线程是异步的,子线程没结束,主线程可能已经结束了。
UncaughtExceptionHandler名字意味着处理未捕获的异常。更明确的说,它处理未捕获的运行时异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* Package:
* Description: 线程异常打印
* Author: yujie
* Date: Created in 2018/5/14 18:25
* Company:
* Copyright: Copyright (c) 2018
* Version: 1.0.0
* Modified By:
*/
@Slf4j
public class ThreadExceptionDebugger implements Thread.UncaughtExceptionHandler {

ThreadPoolExecutor pool;

public ThreadExceptionDebugger() {
}


public ThreadExceptionDebugger(ThreadPoolExecutor pool) {
this.pool = pool;
}

@Override
public void uncaughtException(final Thread t, Throwable e) {
log.error("当前线程异常");
if (pool != null) {
log.error(" 当前线程池状态:");
log.error(" active:" + pool.getActiveCount());
log.error(" corePool:" + pool.getCorePoolSize());
log.error(" poolSize:" + pool.getPoolSize());
log.error(" taskCount:" + pool.getTaskCount());
log.error(" queueCount:" + pool.getQueue().size());
}
log.error(" 线程信息:" + e.getMessage() );
log.error(" 线程名字:" + t.getName());
log.error(" 线程ID:" + t.getId());
log.error(" 线程状态:" + t.getState());

// log.error("[Exception Message]:" + e.getMessage());
// log.error("[Exception][Thread Name]:" + t.getName()
// + ",[Exception][Thread id]:" + t.getId()
// + ",[Thread state]:" + t.getState());
StackTraceElement[] elements = e.getStackTrace();
log.error(" 异常信息:" + e.getMessage() );
log.error(" 异常代码块" );
for (int i = 0; i < elements.length; i++) {
// log.error("Number[" + i + "],[FileName]:" + elements[i].getFileName() +
// ",[ClassName]:" + elements[i].getClassName() +
// ",[LineNumber]:" + elements[i].getLineNumber() +
// ",[MethodName]:" + elements[i].getMethodName());

log.error(" 序列号:" + i );
log.error(" 文件名:" + elements[i].getFileName());
log.error(" 类名:" + elements[i].getClassName());
log.error(" 行号:" + elements[i].getLineNumber());
log.error(" 方法名:" + elements[i].getMethodName());

// log.error("[序列号]:" + i + ",[文件名]:" + elements[i].getFileName() +
// ",[类名]:" + elements[i].getClassName() +
// ",[行号]:" + elements[i].getLineNumber() +
// ",[方法名]:" + elements[i].getMethodName());
}
// e.printStackTrace();
}
}

UncaughtExceptionHandler

UncaughtExceptionHandler#setUncaughtExceptionHandler

1
2
3
4
5
6
public interface UncaughtExceptionHandler

public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
checkAccess();
uncaughtExceptionHandler = eh;
}

# Java

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×