Java Exception 捕获和显示实例详解

 更新时间:2017年03月28日 16:43:48   投稿:lqh  
这篇文章主要介绍了Java Exception 捕获和显示实例详解的相关资料,需要的朋友可以参考下

Java Exception 捕获和显示实例详解

  在进行Java B/S架构开发时,经常有这样的场景:后端处理业务逻辑,前端负责展示,当后端处理出现异常时,如何把错误信息展示给前台呢?错误信息栈通常很多,对开发人员查找问题比较方便,但对于客户来说,打一堆的错误信息,无疑是对他们感官的一种摧残,如何捕捉最重要的信息显示到客户端呢?该信息要求简明扼要,指向出错点,且应指明异常的类型。

        在很多情况下Exception的 getMessage()方法返回空的值,如果使用该方式则会在前端显示空值。我们要显示的重要信息有两个:

  •          异常类型
  •          出错点和出错信息        

1、异常类型如何获得呢?

可以通过Exception 的getClass().getName()方法来实现。

2、出错点如何获得呢?

出错点信息一般在“Cause by:”标识开始的行。如果能抓取到该行,则可取出异常信息,一个异常栈例子如下:

Caused by: org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF> 
  at org.apache.activemq.selector.SelectorParser.generateParseException(SelectorParser.java:1231) 
  at org.apache.activemq.selector.SelectorParser.jj_consume_token(SelectorParser.java:1179) 
  at org.apache.activemq.selector.SelectorParser.unaryExpr(SelectorParser.java:468) 
  at org.apache.activemq.selector.SelectorParser.multExpr(SelectorParser.java:390) 
  at org.apache.activemq.selector.SelectorParser.addExpression(SelectorParser.java:359) 
  at org.apache.activemq.selector.SelectorParser.comparisonExpression(SelectorParser.java:211) 
  at org.apache.activemq.selector.SelectorParser.equalityExpression(SelectorParser.java:156) 
  at org.apache.activemq.selector.SelectorParser.andExpression(SelectorParser.java:135) 
  at org.apache.activemq.selector.SelectorParser.orExpression(SelectorParser.java:114) 
  at org.apache.activemq.selector.SelectorParser.JmsSelector(SelectorParser.java:106) 
  at org.apache.activemq.selector.SelectorParser.parse(SelectorParser.java:84) 
  ... 63 more 

        由于一些原因,往往它并不出现在第一行,所以,通过取第一行的方式不能获取出错点和出错提示信息。

        如果自己解析该输出,一行一行地读入,然后通过判断首字符是否是“Caused by:” 也能抓取到出错点和出错信息。

        最简单的方式,还是使用正则表达式,可以比较简单地实现抓取出错点和出错信息。例如:

代码1:使用正则表达式获取出错点和出错信息

String regEx = "Caused by:(.*)";  
Pattern pat = Pattern.compile(regEx);  
Matcher mat = pat.matcher(content);  
boolean rs = mat.find();  
System.out.println("found?" + rs); 
System.out.println(mat.group(1)); 

代码1的结果输出:

org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF>

3、异常信息的获取

         虽然知道了如何找出错点,但异常信息如何获得呢?Exception.printStrackTrace()中虽然有出错点信息,但都打到控制台上去了,Exception.getStackTrace(),并不能获得出错点的提示信息。

        一个应对办法就是捕获e.printStrackTrace()输出, 使用e.printStackTrace(PrintStream)方法,将异常栈信息先输出到ByteOutputStream ,然后再将ByteOutputStream 转换为字符串,就获得了异常的完整输出。代码为:

代码2:获取完整异常信息

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
e.printStackTrace(new PrintStream(baos)); 
String exception = baos.toString(); 
System.out.println("baos:" + exception); 

完整的测试代码--异常Caused by捕获(注:该测试代码中并没有出现Caused by字样,实际应用代码比较多,没有放进测试用例中):

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.PrintStream; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
 
public class RegexpTest { 
  /** 
   * 读取文件中的内容 
   * @return 
   */ 
  public String readFile(){ 
    try { 
      String fileName = "D:\\test2\\exception.log"; 
      File f = new File(fileName); 
      FileInputStream fis = new FileInputStream(f); 
      int filesize = fis.available(); 
      byte[] buffer = new byte[filesize]; 
      fis.read(buffer); 
      return new String(buffer); 
    } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
    }     
  } 
   
  /** 
   * 正则表达式测试 
   */ 
  public void test(){ 
    try { 
      String content = readFile(); 
      System.out.println(content); 
       
      String regEx = "Caused by:(.*)";  
      Pattern pat = Pattern.compile(regEx);  
      Matcher mat = pat.matcher(content);  
      boolean rs = mat.find();  
      System.out.println("found?" + rs); 
      System.out.println(mat.group(1)); 
//     for(int i=1;i<=mat.groupCount();i++){  
//       System.out.println("found:" + mat.group(i));  
//     }   
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
   
  public void test2(){ 
    try { 
      FileInputStream fis = new FileInputStream("d:\\test.txt"); 
      fis.read(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      e.printStackTrace(new PrintStream(baos)); 
      String exception = baos.toString(); 
      System.out.println("exception:" + exception); 
    } 
  } 
   
  public static void main(String[] args) { 
    RegexpTest rt = new RegexpTest(); 
    //rt.test(); 
    rt.test2(); 
  } 

4、获取异常类型和出错点还有一种简单的方法

获取出错点类型:

e.getCause().getClass() 

获取出错点信息(出错原因):

e.getCause().getMessage() 

代码示例(注:实际代码截取,不可直接运行):

 @SuppressWarnings("unchecked") 
  @RequestMapping(value="/createSubscriber", method = RequestMethod.POST) 
  public @ResponseBody 
  WrappedResult createSubscriber(@ItemsRequestBody List<Map> list) { 
    LocalBrokerFacade facade = new LocalBrokerFacade(BrokerRegistry.getInstance().findFirst()); 
    WrappedResult result = new WrappedResult(); 
    try { 
      Map params = list.get(0); 
      String clientId = (String)params.get("clientId"); 
      String subscriberName = (String)params.get("subscriberName"); 
      String topicName = (String)params.get("topicName"); 
      String selector = (String)params.get("selector"); 
       
//     if("".equals(selector)){ 
//       selector = null; 
//     } 
       
      facade.getBrokerAdmin().createDurableSubscriber(clientId, 
          subscriberName,topicName,selector); 
      result.setSuccessful(true); 
    } catch (Exception e) { 
      System.out.println("Exception:" + e.getCause().getClass() + "," + e.getCause().getMessage()); 
      //log.error("createSubscriber failed.", e); 
    } 



  输出:

Exception:class org.apache.activemq.selector.ParseException,Parse error at line 0, column 0. Encountered: <EOF>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Java 中通过 key 获取锁的方法

    Java 中通过 key 获取锁的方法

    这篇文章主要介绍了Java 中通过 key 获取锁,本文演示如何对某个 key 加锁,以保证对该 key 的并发操作限制,可以实现同一个 key 一个或者多个线程同时执行,需要的朋友可以参考下
    2022-11-11
  • 浅谈spring boot使用thymeleaf版本的问题

    浅谈spring boot使用thymeleaf版本的问题

    这篇文章主要介绍了spring boot使用thymeleaf版本的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 深入探究SpringBoot中的Sleuth用法

    深入探究SpringBoot中的Sleuth用法

    Sleuth是一个分布式跟踪系统,用于跟踪应用程序中的请求和操作,在本文中,我们将探讨SpringBoot中的Sleuth是什么,以及如何使用它来跟踪应用程序中的请求和操作,感兴趣的小伙伴跟着小编一起来探讨吧
    2023-07-07
  • java基本事件处理机制解析

    java基本事件处理机制解析

    这篇文章主要介绍了java基本事件处理机制解析, Java事件处理机制是一种用于处理用户交互和系统事件的编程模型,它基于事件驱动的思想,通过监听和响应事件来实现程序的交互性和动态性,需要的朋友可以参考下
    2023-10-10
  • Java函数式编程(十):收集器

    Java函数式编程(十):收集器

    这篇文章主要介绍了Java函数式编程(十):收集器,本文是系列文章的第10篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下
    2014-09-09
  • nacos一直频繁的打印日志get changegroupkeys问题

    nacos一直频繁的打印日志get changegroupkeys问题

    这篇文章主要介绍了nacos一直频繁的打印日志get changegroupkeys问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java中的方法内联介绍

    Java中的方法内联介绍

    大家好,本篇文章主要讲的是Java中的方法内联介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 解决springboot生成bean名称冲突(AnnotationBeanNameGenerator)

    解决springboot生成bean名称冲突(AnnotationBeanNameGenerator)

    这篇文章主要介绍了解决springboot生成bean名称冲突(AnnotationBeanNameGenerator),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • springboot集成websocket的四种方式小结

    springboot集成websocket的四种方式小结

    本文主要介绍了springboot集成websocket的四种方式小结,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 关于Java应用日志与Jaeger的trace关联的问题

    关于Java应用日志与Jaeger的trace关联的问题

    这篇文章主要介绍了Java应用日志如何与Jaeger的trace关联,通过jaeger发现这十次请求中有一次耗时特别长,想定位一下具体原因,感兴趣的朋友跟随小编一起看看吧
    2022-01-01

最新评论