我正在尝试执行用户编写的JavaScript,并获取用户代码中任何潜在错误的行号。我已经看过有关SO的现有帖子。
当前,我正在执行以下操作:
const userProg = document.createElement('script')
userProg.type = 'text/javascript'
userProg.id = 'user-program'
userProg.text = userCode //string containing user's code
document.head.appendChild(userProg)
并且为了捕获用户代码中的错误,我执行以下操作:
window.onerror = function (msg, url, lineNo, colNo, error) {
//User code will have anonymous in the stack
if(error.stack.includes("anonymous")) {
console.log("user code has error at line: " + lineNo)
}
return false
}
这很好用- if 如果变量userCode
有点像“ test = hello”一样乱七八糟。例如,window.onerror
将记录:
这种方法的问题在于,如果用户代码确实存在严重错误(例如不成对的引号),则appendChild
(或eval()
)会中断并抛出Uncaught SyntaxError
。
这是一个示例,其中userCode只是hello"
-注意行号不是在<anonymous>
而是在appendChild
的{{1}}行,因此阻止了我从获取用户代码有错误的行中删除。还要注意我的generateScript
函数如何不记录错误的行号。
我是否有办法在用户代码中获取错误的行号,即使该错误的语法错误非常严重(例如引号不匹配)也是如此。
我注意到的一个潜在的线索是,在第二个示例中,控制台输出“ VM63:3”,而3是用户代码的正确行号。 (单击“ VM63:3”会将我带到用户代码中)也许可以通过控制台执行操作来获取正确的行号?
更新1-好像这个项目:https://github.com/jlongster/unwinder符合我的要求。只是不确定它是如何工作的。