Java Exception 捕获和显示实例详解
作者:lqh 发布时间:2022-07-05 22:41:09
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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/qq_35101189/article/details/67634804


猜你喜欢
- Intro做项目的时候,页面上有一些敏感信息,需要用“*”隐藏一些比较重要的信息,于是打算写一个通用的方法。Let's do it
- 1使用背景在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行
- spring缓存cache的使用在spring配置文件中添加schema和spring对缓存注解的支持:<?xml version=&
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.循环队列循环队列 (Circular Queue) 是一
- spring-cloud-config 配置中心实现Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中
- 本文实例讲述了C#.net实现在Winform中从internet下载文件的方法。分享给大家供大家参考。具体如下:自己做了一个通用的软件自动
- Aop什么是Aop?AOP就是面向切面编程,通过预编译方式以及运行期间的 * 技术来实现程序的统一维护功能。什么是切面,我理解的切面就是两
- 前言在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去
- 在Android上,不止一个途径来侦听用户和应用程序之间交互的事件。对于用户界面里的事件,侦听方法就是从与用户交互的特定视图对象截获这些事件
- 本文实例为大家分享了JavaSE实现猜拳游戏的具体代码,供大家参考,具体内容如下import java.util.Random;import
- 动态 sql 简单来讲就是我们能通过条件的设置生成不同的 sql,MyBatis 中常用的动态 sql 表达式主要是有五种:ifchoose
- 在web应用中,常常会遇见点击某个链接会弹出一个新的窗口,或者是相互关联的web应用 ,这样要去操作新窗口中的元素,就需要主机切换到新窗口进
- 之前做到日期时间的时候,有许多格式问题和日期时间比较问题,以及相关条件约束,因为不熟悉这个,浪费许多时间,查找相关资料,记录,以作备用。1.
- 原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可
- 一、logback日志技术介绍Spring Boot中使用的日志技术为logback。其与Log4J都出自同一人,性能要优于Log4J,是L
- 先贴代码,后面做一些简单说明:public static string sendPostHttpRequest_2(string url,
- 在java开发中,类、接口、方法,都需要进行注释,注释内容如图:注释中的基本元素有:描述、作者、创建日期。可增加元素有:修改日期、修改内容、
- 定义:/** * @author Administrator * @project: TestOne * @package: PACKAGE
- 任务超时处理是比较常见的需求,比如在进行一些比较耗时的操作(如网络请求)或者在占用一些比较宝贵的资源(如数据库连接)时,我们通常需要给这些操
- 在logback.xml中加上该配置,包名如:com.xxx<logger name="packageName"