我正在开发一个专注于错误处理的 js 库。lib 的一部分是一个堆栈解析器,我想在大多数环境中工作。
没有标准的方式来表示堆栈的困难部分,所以每个环境都有自己的堆栈字符串格式。可变部分是消息、类型和帧。一个框架通常由被调用的函数、文件、行、列组成。
在某些环境中,字符串上有额外的变量区域,在其他环境中,一些变量不存在。我只能在 5 个最常见的环境中运行自动化测试,但我希望解析器在更多环境中工作。
- 我的目标是编写一个自适应解析器,它可以即时学习实际环境的堆栈字符串格式,然后它可以解析该环境的任何异常的堆栈。
我已经有了如何以传统方式解决这个问题的计划,但我很好奇,有没有机器学习工具(可能在无监督学习的主题中)可以用来解决这个问题?
根据评论,我需要澄清术语“堆栈字符串格式”和“堆栈解析器”。我认为最好从不同的环境中编写 2 个示例:
一个。)
示例堆栈字符串:
Statement on line 44: Type mismatch (usually a non-object value used where an object is required)
Backtrace:
Line 44 of linked script file://localhost/G:/js/stacktrace.js
this.undef();
Line 31 of linked script file://localhost/G:/js/stacktrace.js
ex = ex || this.createException();
Line 18 of linked script file://localhost/G:/js/stacktrace.js
var p = new printStackTrace.implementation(), result = p.run(ex);
Line 4 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
printTrace(printStackTrace());
Line 7 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
bar(n - 1);
Line 11 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
bar(2);
Line 15 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html
foo();
堆栈字符串格式(模板):
Statement on line {frames[0].location.line}: {message}
Backtrace:
{foreach frames as frame}
Line {frame.location.line} of {frame.unknown[0]} {frame.location.path}
{frame.calledFunction}
{/foreach}
提取信息(json):
{
message: "Type mismatch (usually a non-object value used where an object is required)",
frames: [
{
calledFunction: "this.undef();",
location: {
path: "file://localhost/G:/js/stacktrace.js",
line: 44
},
unknown: ["linked script"]
},
{
calledFunction: "ex = ex || this.createException();",
location: {
path: "file://localhost/G:/js/stacktrace.js",
line: 31
},
unknown: ["inline#1 script in"]
},
...
]
}
乙)
示例堆栈字符串:
ReferenceError: x is not defined
at repl:1:5
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
堆栈字符串格式(模板):
{type}: {message}
{foreach frames as frame}
{if frame.calledFunction is undefined}
at {frame.location.path}:{frame.location.line}:{frame.location.column}
{else}
at {frame.calledFunction} ({frame.location.path}:{frame.location.line}:{frame.location.column})
{/if}
{/foreach}
提取信息(json):
{
message: "x is not defined",
type: "ReferenceError",
frames: [
{
location: {
path: "repl",
line: 1,
column: 5
}
},
{
calledFunction: "REPLServer.self.eval",
location: {
path: "repl.js",
line: 110,
column: 21
}
},
...
]
}
解析器应该处理堆栈字符串并返回提取的信息。堆栈字符串格式和变量取决于环境,库应该动态地弄清楚如何解析实际环境的堆栈字符串。
我可以通过使用众所周知的堆栈抛出异常来探测实际环境并检查堆栈字符串的差异。例如,如果我在引发异常的行中添加空格缩进,那么列和调用的函数变量可能会发生变化。如果我在某处检测到数字变化,那么我可以确定我们正在谈论的是列变量。我也可以添加换行符,这将导致行号更改等等......
我可以探测每一个重要的变量,但我不能确定实际的字符串不包含额外的未知变量,也不能确定所有已知的变量都会被添加到其中。例如,“A”示例的框架字符串包含未知变量并且不包含列变量,而“B”示例的框架字符串并不总是包含被调用的函数变量。