Java Exception 인스턴스 세부 정보 캡처 및 표시

7213 단어 JavaException포획
Java Exception 인스턴스 세부 정보 캡처 및 표시
자바 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.print Strack Trace () 출력을 포획하고 e.print Stack Trace (Print Stream) 방법을 사용하여 이상 창고 정보를 Byte Output Stream에 먼저 출력한 다음에 Byte Output Stream을 문자열로 바꾸면 이상한 완전한 출력을 얻을 수 있다.코드:
    코드 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>
    
    
    읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기