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

我有一个类似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中)。

如果它实际上是一个运行时异常,例如未定义的变量,那就很好。 问题是如果有分析错误/语法错误,例如不匹配的parens或类似错误。 我什么也没得到。

是否有任何疯狂的解决方法,至少在Firefox和Chrome上起作用? 函数对象内脚本标记内的eval是否在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块中调用someUniqueGlobalName()来运行代码。 在这里,如果存在运行时错误,我可以使用行号获得完整的堆栈跟踪。


您可以更进一步并整合JSLINT: https://github.com/douglascrockford/JSLinthttps://github.com/douglascrockford/JSLint

这很简单..这是一个快速测试...

下载地址:https://raw.github.com/douglascrockford/JSLint/master/jslint.js

jshint_test.html:

<script type="text/javascript" src="jslint.js"></script>
<script>

var result = JSLINT("var some = true;nif (some) {");

if (result)
{
  alert('Looking good');
}
else
{
  var error_message = '';
  for (i in JSLINT.errors)
  {
    var error = JSLINT.errors[i];
    error_message += error.reason + ' on line: ' + error.line + ' character: ' + error.character + "n";
  }
  alert(error_message);
}
</script>

查看文档。 JSLINT的第二个参数是一个选项对象..有许多选项。


也许可能只是使用https://github.com/mattdiamond/fuckitjs

链接地址: http://www.djcxy.com/p/55237.html

上一篇: dynamically load code and get line number of parse error

下一篇: ASP.NET MVC 3 Tutorials desperately needed