是否有可能以编程方式捕获JavaScript语法错误?

时间:2010-03-26 19:27:37

标签: javascript syntax error-handling

我不认为这是可行的,但是想把它扔给社区以证实我的怀疑。

假设您正在使用Python,PHP或ASP等其他语言编写程序。该程序旨在构建另一个用JavaScript编写的程序。但是,遗憾的是,第一个程序不能免于错误。因此,偶尔,构建JavaScript程序的程序会做一些时髦的事情,并在JavaScript源代码中输出语法错误。现在有些用户去加载程序并且它基本上停止了,因为运行它的Web浏览器无法正确解析JavaScript。这个用户可能不会高兴。我不会。

这让我想到了我的问题。是否有可能编写一个错误处理程序来捕获这些语法问题,从而允许应用程序正常失败?

以下是一个例子:

    <html>
  <head>
   <script type="text/javascript" charset="utf-8">
    window.onerror = errorHandler;
    function errorHandler(a,b,c) {
     alert('horray!  No wait, Booo!');
    }
    vara jfs;
   </script>
  </head>
  <body>
   Can this be done?
  </body>
 </html>

<html>
  <head>
   <script type="text/javascript" charset="utf-8">
    try {
     vara jfs;
    } catch  (e) {
     alert('horray!  No wait, Booo!');
    }
   </script>
  </head>
  <body>
   Can this be done?
  </body>
 </html>

3 个答案:

答案 0 :(得分:2)

Google发布了他们的Closure toolset,其中包括JavaScript编译器和最小化程序。我没有亲自使用它,但听过很多很棒的东西。此外,它显然可以帮助您找到浏览器兼容性问题。

我认为它不会帮助您进行实时分析,但仍然可以成为一种有价值的工具。

答案 1 :(得分:2)

如果您对安全风险感到满意,可以在相关代码上调用eval()来检测语法错误。

function say(x) { ... emit message in some way.... }

var scriptlets = [
    "foof1 = function(a) {if (a == 7) { return \"A-OK\"; } } ",
    "foof2 = function (a) {if argle bargle seventy 7, then this isn't going to work}"
];

function verifyScriptlet(n) {
    var s = scriptlets[n];
    try {
        var x = eval(s);
        say("verified #"+ n +", result: " + (typeof x));
    }
    catch (exc1)
    {
        say("Exception while verifying #"+ n +": " + exc1.message);
    }
}

verifyScriptlet(0);
verifyScriptlet(1);

答案 2 :(得分:2)

通常,解析编程语言,如果成功可能编译成另一种形式,并且如果成功则在硬件或vm上解释/执行。仅仅因为代码通过一个阶段,并不意味着它是有效的代码。

您在询问代码是否在最后阶段运行,可以发现第一部分遇到的问题并进行处理。

有些语言为它自己的解析和编译机制提供了各种钩子。正如Cheeso所提到的,eval是Javascript调用此机制的方式。

不是将所有脚本包装在字符串中,而是将它们保存在javascript文件中,并使用以下javascript(或类似)将它们加载到主程序中可能更好。

 function load(file){
    var client = new XMLHttpRequest();
    client.open("GET", file, false);
    client.send(null);
    return client.responseText;
  }

  function include(file){
    try {
      eval(load(file));
    } catch (e) {
       alert("problem with file " + file);
    }
  }