打卡百天计划第四天-Hook线程以及捕获线程执行异常

    技术2022-07-10  109

    线程在执行单元中是不允许抛出异常的,而线程在运行在自己的上下文中,派生他的线程将无法直接获得它运行中出现的异常信息。为此java提供了一个UncaughtExceptionHandler接口(是一个FunctionInterface函数式接口,只有一个方法dispatchUncaughtExceptionHandler())。

    关于异常处理的四个API

    Thread类中关于UncaughtExceptionHandler的四个api:

    public void setUncaughtExceptionHandler(UncaughtException eh)

    为某个特定线程指定UncaughtExceptionHandler。

    public static void setDefaultUncaughtExceptionHandler(UncaughtException eh)

    设置全局的UncaughtExceptionHandler。

    public UncaughtExceptionHandler getUncaughtExceptionHandler();

    获取特定线程的UncaughtExceptionHandler

    public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();

    获取全局的UncaughtExceptionHandler。

    package day0518; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; /** * @author liw * @date 2020-06-16 */ public class Demo1 { public static void main(String[] args) throws InterruptedException { Thread.setDefaultUncaughtExceptionHandler((t, e) -> { System.out.println(t.getName() + "发生了异常"); e.printStackTrace(); }); Thread thread = new Thread(()->{ try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(1/0); },"ThreadTest") ; thread.start(); } }

    执行结果:

    ThreadTest发生了异常 java.lang.ArithmeticException: / by zero at day0518.Demo1.lambda$main$1(Demo1.java:27) at java.lang.Thread.run(Thread.java:748) Process finished with exit code 0

    Processed: 0.013, SQL: 9