Найти, где возникает синтаксическая ошибка при сбое новой функции()

Чтобы сократить длинный раздел комментариев "Не использовать новую функцию" и/или "eval is evil", этот вопрос касается того, как получить доступ, если возможно, к информации об ошибке, связанной с конструктором new Function(), Это в основном вопрос об обнаружении ограничения в том, что браузер позволит мне делать, пытаясь использовать JavaScript в той мере, в какой позволяют спецификации и стандартные версии браузера. Итак, с этим отказом на месте:

При оценке кода с помощью нового вызова Function() существует ли способ узнать, где в содержимом функции возникает синтаксическая ошибка, если выполняется анализ кода недействительного синтаксиса? то есть:.

try {
  var generator = new Function(input);
  try {
    generator();
  }
  catch (runtimeError) {
    console.error("legal code; unforeseen result: ", runtimeError);
  }
}
catch (syntaxError) {
  console.error("illegal code; syntax errors: ", syntaxError);
}

Когда здание генератора выходит из строя, существует ли способ узнать (из браузера, не используя jslint или другую внешнюю библиотеку), что такое ошибка или где она произошла?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype упоминает, что свойство SyntaxError имеет свойство filename и linenumber, но это undefined для динамического кода, оцененного с помощью новой функции (), из того, что я могу сказать, поэтому полагаться на сам объект ошибки, кажется, не вариант. Существуют ли альтернативные способы введения кода в браузер, чтобы код, как только мы знаем, что он имеет синтаксические ошибки из-за неудачного нового вызова функции, может быть использован, чтобы выяснить, где проблема в соответствии с используемым двигателем JS?

(Конечно, если целью было просто найти синтаксические ошибки, то jslint в качестве шага препроцесса будет подходящим решением, но меня больше интересует, могут ли браузеры каким-либо образом сообщать об этом информации, даже если в ограниченной форме, например "есть некоторая ошибка в строке / char..." )

Ответы

Ответ 1

afaik невозможно узнать, где он произошел. но вы можете увидеть Exception.message для получения информации о том, что произошло.

example: http://jsbin.com/IRoDiJIV/1/watch?js

Ответ 2

Нашел решение самостоятельно, используя метод simiar для установки точек останова в evaled code

В панели источников инструментов chrome dev я помещаю следующее в условную точку останова на строку new Function (так как это код библиотеки, и я не могу ее изменить).

(function(eval_js, load_js) {
  try {
    eval(eval_js);
  } catch (e) {
    (function addCode(js) {
      var e = document.createElement('script');
      e.type = 'text/javascript';
      e.src = 'data:text/javascript;charset=utf-8,' + escape(js);
      document.body.appendChild(e);
      console.warn("Inserted Script for ", js);
    })(load_js.replace(/;/g,";\n"));
    handlerCode = "";
    return false;
  }
  return false;
})("new Function('event', handlerCode)", handlerCode)