欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Exception 捕获和显示实例详解

程序员文章站 2024-03-02 18:02:16
java exception 捕获和显示实例详解   在进行java b/s架构开发时,经常有这样的场景:后端处理业务逻辑,前端负责展示,当后端处理出现异常时,...

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>

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