Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取和解析Java异常_Java_Regex_Parsing_Exception - Fatal编程技术网

读取和解析Java异常

读取和解析Java异常,java,regex,parsing,exception,Java,Regex,Parsing,Exception,我有一个小系统,我想提供一个可以分析错误/异常并提出可能的解决方案的产品 所以我想要一种解析java异常的方法(因为我只在日志中有它们[我不想影响实际的系统]) 解析后,我想将其保存在DB中,并将其与以前保存的异常(以某种格式)进行比较,以便找到最接近的匹配异常 我想到了以下想法: “XException at A at B at C at D”将保存为[XException,A,B,C,D],我将以某种方式在我的数据库中搜索:[XException,,,,,,?],这是最接近的。例如:[XEx

我有一个小系统,我想提供一个可以分析错误/异常并提出可能的解决方案的产品

所以我想要一种解析java异常的方法(因为我只在日志中有它们[我不想影响实际的系统])

解析后,我想将其保存在DB中,并将其与以前保存的异常(以某种格式)进行比较,以便找到最接近的匹配异常

我想到了以下想法: “XException at A at B at C at D”将保存为[XException,A,B,C,D],我将以某种方式在我的数据库中搜索:[XException,,,,,,?],这是最接近的。例如:[XException,A,G,C,D]非常好

你觉得这些想法怎么样

有没有有效的方法来解析异常

定义两个异常之间距离的有效或更好的方法

知道任何可以做到这一点的开放源码-我saure没有找到任何


谢谢。

我想这个问题会因为太开放而结束。因此,它适用于能够给出明确答案的问题

即便如此,在此之前,我想说这似乎是一个不错的主意,我希望你能让它发挥作用。最好将重点放在堆栈跟踪的那些部分上,它们清楚地标识不可变的信息,如包、类和方法名。至于检测部分或完全匹配,我建议您研究已知的索引和匹配算法。可以应用一些著名的文本搜索算法,但“原子”单元是方法名或包限定的类名(如果是单个字母或单词)

祝你好运


编辑:只是想了些别的。您可能希望专注于使实现尽可能通用于许多不同编程语言、框架等的堆栈跟踪。这将使软件更加经得起未来考验并具有广泛的适用性。

这是一项相当艰巨的工作,但下面是一个解析实时生成的一些实际异常的演示

  • 该方法被称为generate_$,以尝试覆盖命名奇怪的方法。我肯定我还没有涵盖所有的案例
  • 将它们重新构建到java.lang.StackTraceeElement列表中,因为它似乎是适合该作业的类型
代码:


如果您仔细设计了系统,您将在适当的位置捕获异常,并显示适当的人类可读消息。如果您想编写一个分析其他人应用程序错误的应用程序。我认为这个应用程序最终可能会变得模糊不清。只是我的想法。谢谢,干得好。但是,正则表达式中有一个小错误:在生成的文件名中有一个额外的“(”。将…(\\(.*java)…更改为…\(.*java)…此外,此正则表达式不能正确解析“\tat sun.nio.ch.WindowsSelectorImpl$1.access$400(未知源)\n”或“\tat sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(本机方法)\n”。
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)]