Thread如何捕获异常

Posted Android Rookie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thread如何捕获异常相关的知识,希望对你有一定的参考价值。

前言

参照Think in Java
PS:只为了自己学习与查找,欢迎指正和提问

由于线程的本质特性,使得你不能捕获从线程中逃逸的异常。一旦异常逃出任务的run()方法,它就会想外传播到控制台,除非你采取特殊的步骤捕获这种错误的异常。在Java SE5之前,你可以使用线程组来捕获这些异常,但是有了Java SE5,就可以用Executor来解决这个问题,因此你就不再需要了解有关线程组的任何知识了。
Thread.UncaughtExceptionHandler是Java SE5 中的新接口,它允许你再每个Thread对象上都附着一个异常处理器。Thread.UncaughtExceptionHandler()会在线程因未捕获的异常而面临死亡是被调用。

     public static void main(String[] args) 

        Thread.setDefaultUncaughtExceptionHandler((t,e)->
        //默认的异常处理器
            System.out.println("default"+e.toString());
        );

        Thread thread = new Thread(() -> 
                throw new RuntimeException("error ");
        );

        thread.setUncaughtExceptionHandler((t, e) -> 
        //异常处理器
            System.out.println("thread :"+e.toString());
        );

        thread.start();
    

如果你知道将要在代码中处处使用相同的异常处理器,那么更简单的方式是在Thread类中设置一个静态域,并将这个处理器设置为默认的未捕获异常处理器Thread.setDefaultUncaughtExceptionHandler(),这个处理器只有在不存在线程专有的未捕获异常处理器的情况下才会调用。系统会检查线程专有版本,如果没有发现,则检查线程组是否有其专有的uncaughtException(),如果也没有,再调用defaultUncaughtExceptionHandler

以上是关于Thread如何捕获异常的主要内容,如果未能解决你的问题,请参考以下文章

多线程情况下如何捕获线程中的异常?

外传二 函数的异常规格说明

线程 Thread.UncaughtExceptionHandler 异常捕获

如果在生成 std​​::thread 后引发异常,则不会捕获异常

Android Thread.UncaughtExceptionHandler异常消息捕获

如何在Qt中捕获异常?