Javascript попробовать/поймать
-
02-07-2019 - |
Вопрос
У меня есть функция, которая запускает созданное пользователем регулярное выражение.Однако, если пользователь вводит регулярное выражение, которое не запускается, оно останавливается и падает.Я пробовал поместить строку в блок Try/Catch, но, увы, ничего не происходит.
Если это поможет, я использую jQuery, но в приведенном ниже коде его нет, поскольку я предполагаю, что он немного более фундаментален.
Редактировать:Да, я знаю, что не избегаю «[», это намеренно и суть вопроса.Я принимаю вводимые пользователем данные и хочу найти способ решить подобные проблемы, чтобы приложение не развалилось.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Regex</title>
<script type="text/javascript" charset="utf-8">
var grep = new RegExp('gr[');
try
{
var results = grep.exec('bob went to town');
}
catch (e)
{
//Do nothing?
}
alert('If you can see this then the script kept going');
</script>
</head>
<body>
</body>
</html>
Решение
Попробуйте это, новый RegExp выдает исключение
регулярное выражение
<script type="text/javascript" charset="utf-8">
var grep;
try {
grep = new RegExp("gr[");
}
catch(e) {
alert(e);
}
try
{
var results = grep.exec('bob went to town');
}
catch (e)
{
//Do nothing?
}
alert('If you can see this then the script kept going');
</script>
Другие советы
Проблема в этой строке:
var grep = new RegExp('gr[');
'[' — специальный символ, поэтому его необходимо экранировать.Кроме того, эта строка не заключена в try...catch, поэтому вы все равно получите ошибку.
Редактировать:Вы также можете добавить
alert(e.message);
в предложении catch, чтобы увидеть сообщение об ошибке.Это полезно для всех видов ошибок в JavaScript.
Редактировать 2:Хорошо, мне нужно было более внимательно прочитать вопрос, но ответ все еще там.В примере кода строка, вызывающая нарушение, не заключена в блок try...catch.Я поместил его туда и не получил ошибок в Opera 9.5, FF3 и IE7.
var grep, results;
try {
grep = new RegExp("gr[");
results = grep.exec('bob went to town');
}
catch(e) {
alert(e);
}
alert('If you can see this then the script kept going');
установка инициализации RegExp внутри try/catch будет работать (только что протестировано в FireFox)
var grep, results;
try
{
grep = new RegExp("gr["); // your user input here
}
catch(e)
{
alert("The RegExpr is invalid");
}
// do your stuff with grep and results
Побег отсюда — не выход.Поскольку целью этого фрагмента является фактическое тестирование созданного пользователем RegExpr, вам нужно будет перехватить [ как незакрытый контейнер RegExpr.
ваш RegExp не закрывает [
В моем FireFox он никогда не возвращается из конструктора - выглядит как ошибка в реализации RegExp, но если вы предоставляете допустимое выражение, оно работает.
Одним из вариантов является проверка выражений, созданных пользователем.То есть;escape-символы, которые, как вы знаете, остановят ваш сценарий.