0
点赞
收藏
分享

微信扫一扫

多线程中设置线程未捕获错误信息处理器*


setDefaultUncaughtExceptionHandler() // 设置全局的默认未捕获错误信息代码
setUncaughtExceptionHandler() //设置当前线程的未捕获错误信息代码

如果线程发生异常了就会执行设置的Handler代码

可以在handler代码块儿里面执行一些逻辑啥的.

没设置自定义异常效果:

当前线程异常前
子线程异常前
Exception in thread "Thread-0" Exception in thread "main" java.lang.ArithmeticException: / by zero
at A_线程基础.b_设置多线程自定义异常.Test01$1.run(Test01.java:29)
at java.lang.Thread.run(Thread.java:748)
java.lang.ArithmeticException: / by zero
at A_线程基础.b_设置多线程自定义异常.Test01.test(Test01.java:33)
at A_线程基础.b_设置多线程自定义异常.Test01.main(Test01.java:17)

Process finished with exit code 1

设置了自定义异常的结果

[当前线程的Handler处理器信息] : Thread[Thread-0,5,main]
/ by zero
【默认的Handler处理异常信息】start------------
java.lang.ArithmeticException: / by zero
at A_线程基础.b_设置多线程自定义异常.Test01.test2(Test01.java:88)
at A_线程基础.b_设置多线程自定义异常.Test01.main(Test01.java:18)
------------end

Process finished with exit code 1

下面是代码

import java.io.PrintWriter;
import java.io.StringWriter;

/**
*
案例代码:zjj_parent_7aa0587a-9db1-e2de-1c6c-8299d246423e
* 参考:
* <p>
*/
public class Test01 {
public static void main(String[] args) {
// test(); // 没设置自定义异常的
test2(); //设置自定义异常的
}
/**
* 没设置自定义异常的
*/
private static void test() {

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程异常前");
System.out.println(1 / 0);
}
}).start();
System.out.println("当前线程异常前");
System.out.println(1 / 0);
System.out.println("异常后的代码不能执行"); //发生异常之后 这个代码是不能执行的.
}
/**
* 设置自定义异常
* 如果线程出现了未被捕获的异常,则会执行 uncaughtException方法,
*/
private static void test2() {

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程异常前");
System.out.println(1 / 0);


}
});


Thread.UncaughtExceptionHandler currentHandler
= new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("[当前线程的Handler处理器信息] : " + t.toString() + "\n" + e.getMessage());
}
};
/*如果注释下面的,程序出现了未捕获的错误信息不会执行currentHandler方法的代码,
如果有设置setDefaultUncaughtExceptionHandler 就执行该设置的Handler代码.

如果不注释下面的代码,则执行当前线程的未捕获错误信息代码,默认的未捕获错误信息代码(defaultHandler)将不执行
* */
thread.setUncaughtExceptionHandler(currentHandler);//设置未捕获异常处理器

Thread.UncaughtExceptionHandler defaultHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
printWriter.write("start------------\n");
e.printStackTrace(printWriter);
printWriter.write("------------end");
printWriter.close();
System.out.println("【默认的Handler处理异常信息】" + writer.getBuffer().toString());
}
};
/*如果注释掉,main线程报错会直接打印到控制台,不执行defaultHandler的代码
* 如果不注释,主线程和子线程的未捕获的错误出现都会执行defaultHandler的代码
* */
Thread.setDefaultUncaughtExceptionHandler(defaultHandler);//设置默认未捕获异常处理器


thread.start();

System.out.println("当前线程异常前");
System.out.println(1 / 0);
System.out.println("异常后的代码不能执行"); //发生异常之后 这个代码是不能执行的.
}



}


举报

相关推荐

0 条评论