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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: .NET示波器控件的实例代码分析