原创

Java异常和错误捕获不当导致出现问题无法输出堆栈信息

笔者生产环境遇到过一个神奇的bug,某个定时任务线程执行过程中,没有抛异常,直接没了,死掉了。

1.java中Exception、Error、Throwable你会玩?

源码大家都有,这里不细讲

先看例子:

 public static void testException() {
  try {
   System.out.println(" testException start");
   throw new NoSuchMethodError();
  } catch (Exception e) {
   System.out.println("testException catch");
  }
 }

上面的testException catch会打印出来吗?“肯定会呀,必须的!”

事实上,不会,为啥不会,因为你捕获的是异常啊,抛出来的是Error,所以捕获不了。

2.怎么玩才能捕获他呢?

小编测试了多种方式,

 public static void testException() {
  try {
   System.out.println(" testException start");
   throw new NoSuchMethodError();
  } catch (Exception e) {
   System.out.println("testException catch");
  }
 }

 public static void testError() {
  try {
   System.out.println("testError start");
   System.out.println(1/0);
  } catch (Error e) {
   e.printStackTrace();
   System.out.println("testError catch");
  }
  System.out.println("aaa");
 }
 
 
 public static void testThrowable() {
  try {
   System.out.println("testThrowable start");
   throw new NoSuchMethodError();
  } catch (Throwable e) {
   e.printStackTrace();
   System.out.println("testThrowable catch");
  }
 }
 



发现,try里面如果捕获Throwable,即可捕获Exception,也可捕获Error,如果捕获Error,代码里面抛出Exception也是捕获不了的。

总结:

一般代码处理异常的时候,最好使用下面这种方式

  try {
   logic
  } catch (Throwable e) {
   e.printStackTrace();
  }

正文到此结束