对线程中未捕获的异常进行处理UncaughtExceptionHandler

简介: 对线程中未捕获的异常进行处理UncaughtExceptionHandler

通常程序中我们会对可能出现的异常进行捕获,例如

public static void main(String[] args) {
    
    System.out.println("##### begin");

    int dividend = 10;
    int divisor = 0;
    try {
        int result = dividend / divisor;
    } catch (Exception e) {
        System.out.println(e);
    }

    System.out.println("##### end");
}

输出结果

##### begin
java.lang.ArithmeticException: / by zero
##### end

如果程序中我们没有对可能出现的异常进行捕获,例如

public static void main(String[] args) {

    System.out.println("##### begin");

    int dividend = 10;
    int divisor = 0;
    int result = dividend / divisor;

    System.out.println("##### end");

}

输出结果

##### begin
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.yzj.ehr.controller.InnerController.main(InnerController.java:153)

Thread类有个方法setUncaughtExceptionHandler(UncaughtExceptionHandler eh),表示我们可以对一个线程自定义自己的未捕获异常处理器。
我们只需写一个类继承UncaughtExceptionHandler接口,重写void uncaughtException(Thread t, Throwable e)方法,然后传入到Thread对象中。

public static void main(String[] args) {

    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("这是对未捕获的异常进行处理方法");
            System.out.println("Thread name:" + t.getName() + ",ex:" + e);
        }
    });

    System.out.println("##### begin");

    int dividend = 10;
    int divisor = 0;
    int result = dividend / divisor;

    System.out.println("##### end");

}

输出结果

##### begin
这是对未捕获的异常进行处理方法
Thread name:main,ex:java.lang.ArithmeticException: / by zero

对不同线程定义不同的未捕获异常处理器

public static void main(String[] args) {

    // 定义main线程的
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("这是对main线程中未捕获的异常进行处理方法");
            System.out.println("@ Thread name:" + t.getName() + ",ex:" + e);
        }
    });

    System.out.println("##### begin");
    
    new Thread(new Runnable() {
        @Override
        public void run() {
         // 定义myThread线程的
            Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(Thread t, Throwable e) {
                    System.out.println("这是对myThread线程中未捕获的异常进行处理方法");
                    System.out.println("# Thread name:" + t.getName() + ",ex:" + e);
                }
            });
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            // 模拟异常
            int[] array = new int[2];
            int value = array[2];
        }
    }, "myThread").start();

    int dividend = 10;
    int divisor = 0;
    int result = dividend / divisor;

    System.out.println("##### end");

}

输出结果

##### begin
这是对main线程中未捕获的异常进行处理方法
@ Thread name:main,ex:java.lang.ArithmeticException: / by zero
这是对myThread线程中未捕获的异常进行处理方法
# Thread name:myThread,ex:java.lang.ArrayIndexOutOfBoundsException: 2
相关文章
|
2月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
78 0
|
2月前
|
监控 Java
在实际应用中选择线程异常捕获方法的考量
【10月更文挑战第15天】选择最适合的线程异常捕获方法需要综合考虑多种因素。没有一种方法是绝对最优的,需要根据具体情况进行权衡和选择。在实际应用中,还需要不断地实践和总结经验,以提高异常处理的效果和程序的稳定性。
30 3
|
2月前
|
监控 Java
捕获线程执行异常的多种方法
【10月更文挑战第15天】捕获线程执行异常的方法多种多样,每种方法都有其特点和适用场景。在实际开发中,需要根据具体情况选择合适的方法或结合多种方法来实现全面有效的线程异常捕获。这有助于提高程序的健壮性和稳定性,减少因线程异常带来的潜在风险。
28 1
|
2月前
|
监控 API
Hook 线程与捕获线程执行异常
【10月更文挑战第11天】Hook 线程和捕获线程执行异常是多线程编程中不可或缺的技术。通过深入理解和掌握这些方法,我们可以提高程序的稳定性和可靠性,更好地应对各种异常情况。同时,在实际应用中要注意平衡性能和准确性,制定合理的异常处理策略,以确保程序的正常运行。
35 1
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
83 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
3月前
|
监控 Java
线程池中线程异常后:销毁还是复用?技术深度剖析
在并发编程中,线程池作为一种高效利用系统资源的工具,被广泛用于处理大量并发任务。然而,当线程池中的线程在执行任务时遇到异常,如何妥善处理这些异常线程成为了一个值得深入探讨的话题。本文将围绕“线程池中线程异常后:销毁还是复用?”这一主题,分享一些实践经验和理论思考。
160 3
|
4月前
|
Java 数据库连接 数据库
当线程中发生异常时的情况分析
【8月更文挑战第22天】
127 4
|
4月前
|
Java
线程池中线程抛了异常,该如何处理?
【8月更文挑战第27天】在Java多线程编程中,线程池(ThreadPool)是一种常用的并发处理工具,它能够有效地管理线程的生命周期,提高资源利用率,并简化并发编程的复杂性。然而,当线程池中的线程在执行任务时抛出异常,如果不妥善处理,这些异常可能会导致程序出现未预料的行为,甚至崩溃。因此,了解并掌握线程池异常处理机制至关重要。
520 0
|
4月前
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题