Javascript eval() Исключение - номер строки

В JavaScript у меня есть var str = ".a long string that contains many lines..." В случае исключения, вызванного eval(str);

Мне понравилось поймать его и напечатать номер строки, вызвавший исключение. (внутренняя строка для str..)

Возможно ли это?

EDIT Как часть проекта Alligator (http://github.com/mrohad/Alligator), сервер приложений для JavaScript, я чтение файлов с диска и eval() все, что вложено в scriplet (<? > )

Я запускаю этот script за пределами браузера, используя NodeJS (поверх V8).

Ответы

Ответ 1

Я нашел решение, которое довольно неэффективно, но я использую его только при debug_mode == 1, так что это не так уж плохо.

Я пишу eval_str в файл, я "импортирую этот файл и вызываю его внутри try {} catch {}, и я разбираю строку ошибки из трассировки стека...

В моем конкретном случае это выглядит так:

var errFileContent = "exports.run = "+evalStringAsAFunction+";";
fs.writeFile('/home/vadmin/Alligator/lib/debugging.js', errFileContent, function (err) {
    var debug = require('./debugging');
    try{
         debug.run(args...);
    }
    catch(er){
         log.debug(parseg(er));
    }
});

Ответ 2

Попробуйте добавить try/catch к строке вместо eval:

var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}';

Ответ 3

1) Run:

var javascript_offset;
try {
  undefined_function();
} catch(ex1) {
  javascript_offset = ex1.lineNumber;
}
try {
  YOUR_STRING_WITH_JS
} catch (ex2) {
  var line_that_caused_it = ex2.lineNumber - javascript_offset -2;
  HANDLE_THE_EXCEPTION_HERE
}

Ответ 4

Это решает вашу проблему?

try {
    eval(str);
} catch (e) {
    console.log(e.lineNumber)
}