2011-02-07 5 views
33

Я хотел знать, можно ли найти через javascript, если вызов eval() имеет синтаксическую ошибку или неопределенную переменную и т. Д. ... так что скажем, я использую eval для произвольного javascript есть способ захватить вывод ошибки этого eval?eval javascript, проверьте ошибку синтаксиса

ответ

49

Вы можете проверить, действительно ли ошибка SyntaxError.

try { 
    eval(code); 
} catch (e) { 
    if (e instanceof SyntaxError) { 
     alert(e.message); 
    } 
} 
+0

Мне интересно, почему я не пробовал это сам. Большое спасибо! –

+3

@ Jesus - То, что вам интересно, это хорошо. Во всяком случае, удачи. – ChaosPandion

0

Согласно Mozilla documentation for eval:

Eval возвращает значение последнего вычисленного выражения.

Так что я думаю, вам может быть не повезло. Этот же документ также рекомендует не использовать eval:

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

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

+2

Об eval быть злым, золотым правилом: не вводить пользовательский ввод, только строки eval, которые вы определили сами, например: с сервера. Да, атака MiTM, но если вы не можете доверять своему серверу, у вас больше проблем. – CularBytes

1

Вы можете использовать http://www.jslint.com/, который содержит парсер javascript, написанный ni javascript. Это даст вам много информации о вашем коде, его можно настроить на более расслабленную или нет, и т. Д.

+0

+1 для JSLint. :-) – Martijn

+0

http://www.jshint.com тоже хорошо. – Andrew

11

При использовании try catch для обнаружения определенного типа ошибки следует убедиться, что другие типы исключений не являются подавлено. В противном случае, если оцениваемый код будет генерировать другой вид исключения, он может исчезнуть и вызвать неожиданное поведение кода.

Я хотел бы предложить сочинительство такого кода:

try { 
    eval(code); 
} catch (e) { 
    if (e instanceof SyntaxError) { 
     alert(e.message); 
    } else { 
     throw(e); 
    } 
} 

Пожалуйста, обратите внимание на "еще" раздел.

+0

throw не является функцией – Dev

Смежные вопросы