中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java利用Exception如何實現捕獲并顯示

發布時間:2020-11-12 16:17:07 來源:億速云 閱讀:194 作者:Leah 欄目:編程語言

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&#63;" + 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&#63;" + 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>

看完上述內容,你們掌握Java利用Exception如何實現捕獲并顯示的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

余干县| 阿克陶县| 乐山市| 滦南县| 津南区| 西乡县| 广灵县| 于田县| 西乌珠穆沁旗| 闸北区| 邵东县| 灵宝市| 正蓝旗| 涟源市| 自治县| 合肥市| 合山市| 祁东县| 都昌县| 临颍县| 繁昌县| 东城区| 铜山县| 庆元县| 德令哈市| 海晏县| 福泉市| 浠水县| 郎溪县| 梅河口市| 白山市| 大英县| 彭阳县| 汝阳县| 女性| 喜德县| 手游| 平湖市| 翁源县| 西充县| 桂林市|