热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

JavaException捕获和显示实例详解

这篇文章主要介绍了JavaException捕获和显示实例详解的相关资料,需要的朋友可以参考下

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:  
  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: 

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 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: 

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


推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
author-avatar
yangerzhou
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有