最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Exception 捕獲和顯示實(shí)例詳解

 更新時(shí)間:2017年03月28日 16:43:48   投稿:lqh  
這篇文章主要介紹了Java Exception 捕獲和顯示實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Java Exception 捕獲和顯示實(shí)例詳解

  在進(jìn)行Java B/S架構(gòu)開(kāi)發(fā)時(shí),經(jīng)常有這樣的場(chǎng)景:后端處理業(yè)務(wù)邏輯,前端負(fù)責(zé)展示,當(dāng)后端處理出現(xiàn)異常時(shí),如何把錯(cuò)誤信息展示給前臺(tái)呢?錯(cuò)誤信息棧通常很多,對(duì)開(kāi)發(fā)人員查找問(wèn)題比較方便,但對(duì)于客戶(hù)來(lái)說(shuō),打一堆的錯(cuò)誤信息,無(wú)疑是對(duì)他們感官的一種摧殘,如何捕捉最重要的信息顯示到客戶(hù)端呢?該信息要求簡(jiǎn)明扼要,指向出錯(cuò)點(diǎn),且應(yīng)指明異常的類(lèi)型。

        在很多情況下Exception的 getMessage()方法返回空的值,如果使用該方式則會(huì)在前端顯示空值。我們要顯示的重要信息有兩個(gè):

  •          異常類(lèi)型
  •          出錯(cuò)點(diǎn)和出錯(cuò)信息        

1、異常類(lèi)型如何獲得呢?

可以通過(guò)Exception 的getClass().getName()方法來(lái)實(shí)現(xiàn)。

2、出錯(cuò)點(diǎn)如何獲得呢?

出錯(cuò)點(diǎn)信息一般在“Cause by:”標(biāo)識(shí)開(kāi)始的行。如果能抓取到該行,則可取出異常信息,一個(gè)異常棧例子如下:

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 

        由于一些原因,往往它并不出現(xiàn)在第一行,所以,通過(guò)取第一行的方式不能獲取出錯(cuò)點(diǎn)和出錯(cuò)提示信息。

        如果自己解析該輸出,一行一行地讀入,然后通過(guò)判斷首字符是否是“Caused by:” 也能抓取到出錯(cuò)點(diǎn)和出錯(cuò)信息。

        最簡(jiǎn)單的方式,還是使用正則表達(dá)式,可以比較簡(jiǎn)單地實(shí)現(xiàn)抓取出錯(cuò)點(diǎn)和出錯(cuò)信息。例如:

代碼1:使用正則表達(dá)式獲取出錯(cuò)點(diǎn)和出錯(cuò)信息

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的結(jié)果輸出:

org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF>

3、異常信息的獲取

         雖然知道了如何找出錯(cuò)點(diǎn),但異常信息如何獲得呢?Exception.printStrackTrace()中雖然有出錯(cuò)點(diǎn)信息,但都打到控制臺(tái)上去了,Exception.getStackTrace(),并不能獲得出錯(cuò)點(diǎn)的提示信息。

        一個(gè)應(yīng)對(duì)辦法就是捕獲e.printStrackTrace()輸出, 使用e.printStackTrace(PrintStream)方法,將異常棧信息先輸出到ByteOutputStream ,然后再將ByteOutputStream 轉(zhuǎn)換為字符串,就獲得了異常的完整輸出。代碼為:

代碼2:獲取完整異常信息

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
e.printStackTrace(new PrintStream(baos)); 
String exception = baos.toString(); 
System.out.println("baos:" + exception); 

完整的測(cè)試代碼--異常Caused by捕獲(注:該測(cè)試代碼中并沒(méi)有出現(xiàn)Caused by字樣,實(shí)際應(yīng)用代碼比較多,沒(méi)有放進(jìn)測(cè)試用例中):

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 { 
  /** 
   * 讀取文件中的內(nèi)容 
   * @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; 
    }     
  } 
   
  /** 
   * 正則表達(dá)式測(cè)試 
   */ 
  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、獲取異常類(lèi)型和出錯(cuò)點(diǎn)還有一種簡(jiǎn)單的方法

獲取出錯(cuò)點(diǎn)類(lèi)型:

e.getCause().getClass() 

獲取出錯(cuò)點(diǎn)信息(出錯(cuò)原因):

e.getCause().getMessage() 

代碼示例(注:實(shí)際代碼截取,不可直接運(yùn)行):

 @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>

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java 中通過(guò) key 獲取鎖的方法

    Java 中通過(guò) key 獲取鎖的方法

    這篇文章主要介紹了Java 中通過(guò) key 獲取鎖,本文演示如何對(duì)某個(gè) key 加鎖,以保證對(duì)該 key 的并發(fā)操作限制,可以實(shí)現(xiàn)同一個(gè) key 一個(gè)或者多個(gè)線程同時(shí)執(zhí)行,需要的朋友可以參考下
    2022-11-11
  • 淺談spring boot使用thymeleaf版本的問(wèn)題

    淺談spring boot使用thymeleaf版本的問(wèn)題

    這篇文章主要介紹了spring boot使用thymeleaf版本的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 深入探究SpringBoot中的Sleuth用法

    深入探究SpringBoot中的Sleuth用法

    Sleuth是一個(gè)分布式跟蹤系統(tǒng),用于跟蹤應(yīng)用程序中的請(qǐng)求和操作,在本文中,我們將探討SpringBoot中的Sleuth是什么,以及如何使用它來(lái)跟蹤應(yīng)用程序中的請(qǐng)求和操作,感興趣的小伙伴跟著小編一起來(lái)探討吧
    2023-07-07
  • java基本事件處理機(jī)制解析

    java基本事件處理機(jī)制解析

    這篇文章主要介紹了java基本事件處理機(jī)制解析,?Java事件處理機(jī)制是一種用于處理用戶(hù)交互和系統(tǒng)事件的編程模型,它基于事件驅(qū)動(dòng)的思想,通過(guò)監(jiān)聽(tīng)和響應(yīng)事件來(lái)實(shí)現(xiàn)程序的交互性和動(dòng)態(tài)性,需要的朋友可以參考下
    2023-10-10
  • Java函數(shù)式編程(十):收集器

    Java函數(shù)式編程(十):收集器

    這篇文章主要介紹了Java函數(shù)式編程(十):收集器,本文是系列文章的第10篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • nacos一直頻繁的打印日志get changegroupkeys問(wèn)題

    nacos一直頻繁的打印日志get changegroupkeys問(wèn)題

    這篇文章主要介紹了nacos一直頻繁的打印日志get changegroupkeys問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中的方法內(nèi)聯(lián)介紹

    Java中的方法內(nèi)聯(lián)介紹

    大家好,本篇文章主要講的是Java中的方法內(nèi)聯(lián)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 解決springboot生成bean名稱(chēng)沖突(AnnotationBeanNameGenerator)

    解決springboot生成bean名稱(chēng)沖突(AnnotationBeanNameGenerator)

    這篇文章主要介紹了解決springboot生成bean名稱(chēng)沖突(AnnotationBeanNameGenerator),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot集成websocket的四種方式小結(jié)

    springboot集成websocket的四種方式小結(jié)

    本文主要介紹了springboot集成websocket的四種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問(wèn)題

    關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問(wèn)題

    這篇文章主要介紹了Java應(yīng)用日志如何與Jaeger的trace關(guān)聯(lián),通過(guò)jaeger發(fā)現(xiàn)這十次請(qǐng)求中有一次耗時(shí)特別長(zhǎng),想定位一下具體原因,感興趣的朋友跟隨小編一起看看吧
    2022-01-01

最新評(píng)論

东兴市| 永州市| 茶陵县| 上栗县| 苍山县| 阿鲁科尔沁旗| 南平市| 元朗区| 太湖县| 高唐县| 宿松县| 凉城县| 全椒县| 崇礼县| 康平县| 卓尼县| 临朐县| 突泉县| 正安县| 南木林县| 抚顺市| 靖远县| 徐水县| 柏乡县| 苍梧县| 柳林县| 布拖县| 乌兰察布市| 和林格尔县| 沙田区| 枞阳县| 湄潭县| 苏尼特右旗| 长武县| 理塘县| 定州市| 霍山县| 佛山市| 察隅县| 花莲市| 上杭县|