Javascript eval () Исключение - номер строки - PullRequest
27 голосов
/ 15 августа 2010

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

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

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

РЕДАКТИРОВАТЬ Как часть проекта Alligator (http://github.com/mrohad/Alligator), сервер приложений для JavaScript, я читаю файлы с диска и eval () все, что вложено в сценарий (<? ?>)

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

Ответы [ 4 ]

6 голосов
/ 16 августа 2010

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

var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}';
3 голосов
/ 16 августа 2010

Я нашел решение, которое довольно неэффективно, но я использую его только когда 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));
    }
});
3 голосов
/ 16 августа 2010

1) Пробег:

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
}
0 голосов
/ 16 августа 2010

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

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