Java Exception 捕获和显示实例详解
JavaException捕获和显示实例详解
在进行JavaB/S架构开发时,经常有这样的场景:后端处理业务逻辑,前端负责展示,当后端处理出现异常时,如何把错误信息展示给前台呢?错误信息栈通常很多,对开发人员查找问题比较方便,但对于客户来说,打一堆的错误信息,无疑是对他们感官的一种摧残,如何捕捉最重要的信息显示到客户端呢?该信息要求简明扼要,指向出错点,且应指明异常的类型。
在很多情况下Exception的getMessage()方法返回空的值,如果使用该方式则会在前端显示空值。我们要显示的重要信息有两个:
- 异常类型
- 出错点和出错信息
1、异常类型如何获得呢?
可以通过Exception的getClass().getName()方法来实现。
2、出错点如何获得呢?
出错点信息一般在“Causeby:”标识开始的行。如果能抓取到该行,则可取出异常信息,一个异常栈例子如下:
Causedby:org.apache.activemq.selector.ParseException:Parseerroratline0,column0.Encountered:atorg.apache.activemq.selector.SelectorParser.generateParseException(SelectorParser.java:1231) atorg.apache.activemq.selector.SelectorParser.jj_consume_token(SelectorParser.java:1179) atorg.apache.activemq.selector.SelectorParser.unaryExpr(SelectorParser.java:468) atorg.apache.activemq.selector.SelectorParser.multExpr(SelectorParser.java:390) atorg.apache.activemq.selector.SelectorParser.addExpression(SelectorParser.java:359) atorg.apache.activemq.selector.SelectorParser.comparisonExpression(SelectorParser.java:211) atorg.apache.activemq.selector.SelectorParser.equalityExpression(SelectorParser.java:156) atorg.apache.activemq.selector.SelectorParser.andExpression(SelectorParser.java:135) atorg.apache.activemq.selector.SelectorParser.orExpression(SelectorParser.java:114) atorg.apache.activemq.selector.SelectorParser.JmsSelector(SelectorParser.java:106) atorg.apache.activemq.selector.SelectorParser.parse(SelectorParser.java:84) ...63more
由于一些原因,往往它并不出现在第一行,所以,通过取第一行的方式不能获取出错点和出错提示信息。
如果自己解析该输出,一行一行地读入,然后通过判断首字符是否是“Causedby:”也能抓取到出错点和出错信息。
最简单的方式,还是使用正则表达式,可以比较简单地实现抓取出错点和出错信息。例如:
代码1:使用正则表达式获取出错点和出错信息
StringregEx="Causedby:(.*)"; Patternpat=Pattern.compile(regEx); Matchermat=pat.matcher(content); booleanrs=mat.find(); System.out.println("found?"+rs); System.out.println(mat.group(1));
代码1的结果输出:
org.apache.activemq.selector.ParseException:Parseerroratline0,column0.Encountered:
3、异常信息的获取
虽然知道了如何找出错点,但异常信息如何获得呢?Exception.printStrackTrace()中虽然有出错点信息,但都打到控制台上去了,Exception.getStackTrace(),并不能获得出错点的提示信息。
一个应对办法就是捕获e.printStrackTrace()输出,使用e.printStackTrace(PrintStream)方法,将异常栈信息先输出到ByteOutputStream,然后再将ByteOutputStream转换为字符串,就获得了异常的完整输出。代码为:
代码2:获取完整异常信息
ByteArrayOutputStreambaos=newByteArrayOutputStream(); e.printStackTrace(newPrintStream(baos)); Stringexception=baos.toString(); System.out.println("baos:"+exception);
完整的测试代码--异常Causedby捕获(注:该测试代码中并没有出现Causedby字样,实际应用代码比较多,没有放进测试用例中):
importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.PrintStream; importjava.util.regex.Matcher; importjava.util.regex.Pattern; publicclassRegexpTest{ /** *读取文件中的内容 *@return */ publicStringreadFile(){ try{ StringfileName="D:\\test2\\exception.log"; Filef=newFile(fileName); FileInputStreamfis=newFileInputStream(f); intfilesize=fis.available(); byte[]buffer=newbyte[filesize]; fis.read(buffer); returnnewString(buffer); }catch(Exceptione){ e.printStackTrace(); returnnull; } } /** *正则表达式测试 */ publicvoidtest(){ try{ Stringcontent=readFile(); System.out.println(content); StringregEx="Causedby:(.*)"; Patternpat=Pattern.compile(regEx); Matchermat=pat.matcher(content); booleanrs=mat.find(); System.out.println("found?"+rs); System.out.println(mat.group(1)); //for(inti=1;i<=mat.groupCount();i++){ //System.out.println("found:"+mat.group(i)); //} }catch(Exceptione){ e.printStackTrace(); } } publicvoidtest2(){ try{ FileInputStreamfis=newFileInputStream("d:\\test.txt"); fis.read(); }catch(Exceptione){ e.printStackTrace(); ByteArrayOutputStreambaos=newByteArrayOutputStream(); e.printStackTrace(newPrintStream(baos)); Stringexception=baos.toString(); System.out.println("exception:"+exception); } } publicstaticvoidmain(String[]args){ RegexpTestrt=newRegexpTest(); //rt.test(); rt.test2(); }
4、获取异常类型和出错点还有一种简单的方法
获取出错点类型:
e.getCause().getClass()
获取出错点信息(出错原因):
e.getCause().getMessage()
代码示例(注:实际代码截取,不可直接运行):
@SuppressWarnings("unchecked") @RequestMapping(value="/createSubscriber",method=RequestMethod.POST) public@ResponseBody WrappedResultcreateSubscriber(@ItemsRequestBodyList
输出:
Exception:classorg.apache.activemq.selector.ParseException,Parseerroratline0,column0.Encountered:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!