Можно ли программно отлавливать ошибки синтаксиса JavaScript? - PullRequest
1 голос
/ 26 марта 2010

Я не думаю, что это выполнимо, но хотел высказать это сообществу, чтобы подтвердить мои подозрения.

Допустим, вы пишете программу на другом языке, таком как Python, PHP или ASP.Эта программа предназначена для создания другой программы, написанной на JavaScript.Однако первая программа, к сожалению, не застрахована от ошибок.Так, иногда, программа, которая строит программу JavaScript, делает что-то напуганное и выводит синтаксическую ошибку в исходный код JavaScript.Теперь какой-то пользователь идет и загружает программу, и она по существу останавливается, потому что веб-браузер, на котором она работает, не может правильно проанализировать 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 ]

2 голосов
/ 26 марта 2010

Если вас устраивает проблема безопасности, вы можете вызвать 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 голосов
/ 26 марта 2010

Как правило, язык программирования анализируется, и, если это удается, возможно, компилируется в другую форму, а если это удается, то интерпретируется / выполняется на оборудовании или виртуальной машине. То, что код проходит одну фазу, не означает, что это правильный код.

Вы спрашиваете, может ли код, запущенный на последнем этапе, знать о проблемах, возникших в первой части, и решать их.

Некоторые языки предлагают различные возможности для собственного механизма синтаксического анализа и компиляции. Как упоминал Чизо, 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);
    }
  }
2 голосов
/ 26 марта 2010

Компания Google выпустила Набор инструментов закрытия , который включает в себя компилятор JavaScript и минимизатор. Я не использовал это лично, но услышал много замечательных вещей. Кроме того, это, очевидно, поможет вам найти проблемы совместимости браузера.

Я не думаю, что это поможет вам выполнить анализ в реальном времени, но все же может быть ценным инструментом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...