我有一个小型系统,我想提供一种可以分析错误/异常并提出可能解决方案的产品。
所以我想要一种解析java异常的方法(因为我只在日志中使用它们[我不想影响实际系统])。
解析后,我想将其保存在数据库中并将其与以前保存的异常(以某种格式)进行比较,以便找到最接近的匹配异常。
我想到了以下想法: “在D处C处的A处的XException”将保存为[XException,A,B,C,D],我将以某种方式在我的DB中搜索:[XException,?,?,?]这是最接近的。例如:[XException,A,G,C,D]非常好。
您如何看待这些想法?
解析异常的任何有效方法?
有效或更好的方法来定义两个异常之间的距离?
知道任何可以做到这一点的开源 - 我觉得没有找到任何。
谢谢。
答案 0 :(得分:5)
这是一项非常艰苦的工作,但这里演示的是解析动态生成的一些实际异常。
代码:
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);
}
}
输出:
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)]
答案 1 :(得分:3)
我想这个问题将因为过于开放而被关闭。 SO旨在提供可以给出明确和明确答案的问题。
即便如此,在此之前,我想说这似乎是个好主意,我希望你能让它发挥作用。最好将注意力集中在堆栈跟踪的那些清楚地标识不可变信息的部分,例如包,类和方法名称。至于检测部分或完全匹配,我建议你研究已知的索引和匹配算法。可以应用一些众所周知的文本搜索算法,但“原子”单位是方法名称或包限定类名,而不是单个字母或单词。
祝你好运! 编辑:想到别的东西。您可能希望专注于使您的实现尽可能通用,以用于许多不同编程语言,框架等的堆栈跟踪。这将使该软件更具有前瞻性和广泛适用性。