当前位置: 移动技术网 > IT编程>开发语言>Java > Java Exception 捕获和显示实例详解

Java Exception 捕获和显示实例详解

2019年07月22日  | 移动技术网IT编程  | 我要评论

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>

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网