gpt4 book ai didi

javascript - 动态加载代码并获取解析错误的行号

转载 作者:数据小太阳 更新时间:2023-10-29 04:48:32 24 4
gpt4 key购买 nike

我有一个工具,类似于 JSFiddle,它允许我动态输入 javascript 并在页面上运行它。代码可以是多行,通常是。

不幸的是,如果我输入的代码出现异常,如果我使用 eval() 运行代码,我无法获取异常的行号。

我找到了一个部分解决方案,而不是使用

try{
eval(code);
}
catch(e) {
processException(e);
}

改为做这样的事情:

var s = document.createElement('script');
s.appendChild(document.createTextNode(
"try{\n" +
code +
"}catch(e){processException(e)}"));
document.body.appendChild(s);

现在,如果代码抛出异常,我查看堆栈跟踪(在我的 processException() 函数中)我可以获得异常的行号(无论如何在 firefox 和 chrome 中)。

如果它实际上是运行时异常,例如 undefined variable ,那一切都很好。问题是是否存在解析错误/语法错误,例如不匹配的括号等。我一无所获。

是否有任何疯狂的解决方法,至少适用于 firefox 和 chrome?在 Function 对象内的脚本标记内的 eval 内求值?我正在尝试一切,但没有找到任何有效的方法。

最佳答案

我终于找到了一个合理的解决方案。

首先,我将 window.onerror 设置为某个函数。这不会获得完整的堆栈跟踪,但会获得文件和行号。

然后,我这样做:

var s = document.createElement('script');
s.appendChild(document.createTextNode(
"var someUniqueGlobalName = function () {\n" +
code +
"\n};";
document.body.appendChild(s);

请注意,这实际上并没有运行我的代码,因为它只是创建了一个函数(在全局范围内,名称为“someUniqueGlobalName”——当然我每次这样做都会想出一个不同的名字这个)。

如果有语法错误,它将在 window.onerror 函数中被捕获,我可以获得错误类型和行号(当然我必须从中减去一个,因为我在开始)。

现在,我取消设置 window.onerror。

最后,我通过在 try/catch block 中调用 someUniqueGlobalName() 来运行代码。如果出现运行时错误,我可以在这里获得包含行号的完整堆栈跟踪。

关于javascript - 动态加载代码并获取解析错误的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7643552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com