2012-04-04 29 views
6

Tôi có một hệ thống nhỏ và tôi muốn cung cấp một sản phẩm có thể phân tích lỗi/ngoại lệ và đề xuất giải pháp khả thi.Đọc và phân tích các ngoại lệ Java

Vì vậy, tôi muốn có cách phân tích cú pháp ngoại lệ java (vì tôi chỉ có chúng trong nhật ký [Tôi không muốn ảnh hưởng đến hệ thống thực tế]).

Sau khi phân tích cú pháp, tôi muốn lưu nó vào một DB và so sánh nó với các ngoại lệ đã lưu trước đó (ở một số định dạng), để tôi có thể tìm được ngoại lệ khớp gần nhất.

Tôi nghĩ về ý tưởng sau: "XException at A at B at C at D" sẽ được lưu thành [XException, A, B, C, D] và tôi sẽ bằng cách nào đó tìm kiếm trong DB của tôi: [XException ,?,?,?] gần nhất. Ví dụ: [XException, A, G, C, D] khá tốt.

Bạn nghĩ gì về những ý tưởng này?

Bất kỳ cách nào hiệu quả để phân tích Ngoại lệ?

Cách hiệu quả hoặc tốt hơn để xác định khoảng cách giữa hai ngoại lệ?

Biết bất kỳ nguồn mở nào có thể thực hiện việc này - Tôi không tìm thấy bất kỳ nguồn nào.

Cảm ơn bạn.

+0

Nếu bạn đã thiết kế hệ thống một cách cẩn thận, bạn sẽ bắt gặp ngoại lệ ở những nơi thích hợp và sẽ hiển thị các thông điệp có thể đọc được con người thích hợp. Nếu bạn muốn viết một ứng dụng phân tích lỗi ứng dụng của người khác.Tôi nghĩ rằng ứng dụng có thể kết thúc mơ hồ. Chỉ là suy nghĩ của tôi. – Nishant

Trả lời

4

Đó là một công việc khá khó khăn, nhưng đây là một minh chứng phân tích một số ngoại lệ thực tế được tạo ra khi đang bay.

  • phương thức này được gọi là generate_ $ để thử và bao gồm các phương thức được đặt tên kỳ lạ. Tôi chắc rằng tôi đã không bảo hiểm tất cả các trường hợp.
  • xây dựng lại chúng trở lại danh sách java.lang.StackTraceElement vì nó có vẻ là loại phù hợp cho công việc.

Code:

private static List<String> generate_$() { 
    List<String> returnValue = new LinkedList<String>(); 
    Exception[] exceptions = { new ClassCastException(), 
      new NullPointerException(), new IOException("foo") }; 
    for (Exception exception : exceptions) { 
     try { 
      throw exception; 
     } catch (Exception e) { 
      StringWriter writer = new StringWriter(); 
      e.printStackTrace(new PrintWriter(writer)); 
      returnValue.add(writer.getBuffer().toString()); 
     } 
    } 
    return returnValue; 
} 

public static void main(String[] args) { 
    List<String> examples = generate_$(); 
    for (String trace : examples) { 
     Pattern headLinePattern = Pattern.compile("([\\w\\.]+)(:.*)?"); 
     Matcher headLineMatcher = headLinePattern.matcher(trace); 
     if (headLineMatcher.find()) { 
      System.out.println("Headline: " + headLineMatcher.group(1)); 
      if (headLineMatcher.group(2) != null) { 
       System.out.println("Optional message " 
         + headLineMatcher.group(2)); 
      } 
     } 
     // "at package.class.method(source.java:123)" 
     Pattern tracePattern = Pattern 
       .compile("\\s*at\\s+([\\w\\.$_]+)\\.([\\w$_]+)(\\(.*java)?:(\\d+)\\)(\\n|\\r\\n)"); 
     Matcher traceMatcher = tracePattern.matcher(trace); 
     List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); 
     while (traceMatcher.find()) { 
      String className = traceMatcher.group(1); 
      String methodName = traceMatcher.group(2); 
      String sourceFile = traceMatcher.group(3); 
      int lineNum = Integer.parseInt(traceMatcher.group(4)); 
      stackTrace.add(new StackTraceElement(className, methodName, 
        sourceFile, lineNum)); 
     } 
     System.out.println("Stack: " + stackTrace); 

    } 
} 

Output:

Headline: java.lang.ClassCastException 
Stack: [com.adamish.ExceptionParse.generate_$((ExceptionParse.java:16), com.adamish.ExceptionParse.main((ExceptionParse.java:31)] 

Headline: java.lang.NullPointerException 
Stack: [com.adamish.ExceptionParse.generate_$((ExceptionParse.java:17), com.adamish.ExceptionParse.main((ExceptionParse.java:31)] 

Headline: java.io.IOException 
Optional message : foo 
Stack: [com.adamish.ExceptionParse.generate_$((ExceptionParse.java:17), com.adamish.ExceptionParse.main((ExceptionParse.java:31)] 
+0

Cảm ơn, công việc tuyệt vời. Tuy nhiên, có một lỗi nhỏ trong regex: có thêm một '(' trong tên tập tin kết quả. Thay đổi ... (\\\ (. * Java) ... thành ... \\\ ((. * java) ... – roesslerj

+0

Ngoài ra, regex này không phân tích cú pháp chính xác "\ tat sun.nio.ch.WindowsSelectorImpl $ 1.access $ 400 (Nguồn không xác định) \ n" hoặc "\ tat sun.nio.ch.WindowsSelectorImpl $ SubSelector.poll0 (Phương thức gốc) \ n ". – roesslerj

2

Tôi đoán câu hỏi này sẽ bị đóng khi quá mở. SO dành cho các câu hỏi có thể được đưa ra các câu trả lời rõ ràng và dứt khoát.

Mặc dù vậy, trước khi điều đó xảy ra, tôi muốn nói rằng điều này có vẻ như một ý tưởng khá hay và tôi hy vọng bạn có thể làm cho nó hoạt động. Tốt nhất là nên tập trung vào những phần của dấu vết ngăn xếp để xác định rõ ràng thông tin bất biến, như tên gói, lớp và phương thức. Đối với phát hiện một phần hoặc hoàn thành phù hợp, tôi đề nghị bạn nhìn vào được biết đến lập chỉ mục và các thuật toán phù hợp. Một số thuật toán nổi tiếng cho tìm kiếm văn bản có thể được áp dụng, nhưng với đơn vị "nguyên tử" là tên phương thức hoặc tên lớp đủ điều kiện thay thế nếu chỉ có một chữ cái hoặc từ.

Chúc may mắn!

CHỈNH SỬA: chỉ cần nghĩ đến điều gì đó khác. Bạn có thể muốn tập trung vào việc thực hiện triển khai của bạn như là chung nhất có thể cho các dấu vết ngăn xếp của nhiều ngôn ngữ lập trình khác nhau, khung công tác, v.v. Điều này sẽ làm cho phần mềm tương thích hơn và được áp dụng rộng rãi hơn.

Các vấn đề liên quan