zoukankan      html  css  js  c++  java
  • Java Thread UncaughtExceptionHandler

      有没有发生过这样的情况,你写的工作线程莫名其妙的挂了,如果不是被你刚好看到,拿只能抓瞎了,不知道啥原因了,因为异常的时候只会把stack trace打在控制台上,不会记在你想记得错误日志里,头皮都抓破了也没能找到确切的地方,最后只能在能加try catch 的地方都给加上。

      Java的异常可以分为这两类,Checked Exceptions和Unchecked Exceptions。

          checked exception例子FileNotFoundException,IOException,...

          unchecked exception例子NumberFormatException...

      我感觉第一类异常就是我们在调用java的方法时,api中指明了是有可能抛出异常,且该类异常是必须捕获的(或向上抛出),否则代码编译不通过,如下:

    try {
        FileOutputStream fos = new FileOutputStream(new File(""));
    } catch (FileNotFoundException e) {//如果此处不进行catch则会编译不通过
                        
    }

      而第二类异常,调用某些方法时,api也提示了可能会抛出某些异常,但该类异常不是一定要捕获的(不捕获编译也能通过),如下

    int i = Integer.parseInt("ff");//该方法的完整声明public static int parseInt(String s) throws NumberFormatException

      不进行try catch也一样能运行,但运行时如果出错,只会在控制台打印下,后面再发现程序有问题很难查找。

      其实Java已经提供了对上述第二类异常问题的处理方法,那就是为Thread设置UncaughtExceptionHandler,即对未知异常的处理,这时你就可以进行相关日志操作了,具体如何做如下:

      先创建一个实现了UncaughtExceptionHandler接口的类

    class MyExceptionHandler implements UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread t, Throwable e) {//在这你可以记录相关错误日志到文件中
            System.out.printf("An exception has been captured
    ");
          System.out.printf("Thread:%s
    ", t.getName());
          System.out.printf("Exception: %s: %s:
    ", e.getClass().getName(), e.getMessage());
          System.out.printf("Stack Trace:
    ");
          e.printStackTrace();
          System.out.printf("Thread status:%s
    ", t.getState());
        }
    }

      将上述Handler的实例赋予你所建的线程

            Thread thread = new Thread(new ThreadTest1()); 
            thread.setUncaughtExceptionHandler(new MyExceptionHandler());
            thread.start();

      如果ThreadTest1中出现了未被捕获的异常,则会执行MyExceptionHandler中的uncaughtException方法,这样就不用死的不明不白了

  • 相关阅读:
    PhpStorm (强大的PHP开发环境)2017.2.4 附注册方法
    laravel中数据库在哪个文件中配置
    php artisan 命令报错,什么命令都是这个错误,cmd下运行也不行,又没看到语法错误...
    SQL Server 2008读书笔记(4):设计SQL Server索引
    Home Dubbo Alibaba Open Sesame
    dynamic language compare great!
    java Math.round()
    regex for java example
    Pycoder's Weekly, Issue #1 Let there be light.
    使用Maven2进行单元测试_我心飞扬_百度空间
  • 原文地址:https://www.cnblogs.com/jadic/p/3532580.html
Copyright © 2011-2022 走看看