Javascript Try / Catch - PullRequest
       29

Javascript Try / Catch

5 голосов
/ 23 сентября 2008

У меня есть функция, которая запускает сгенерированный пользователем Regex. Однако, если пользователь вводит регулярное выражение, которое не запускается, он останавливается и падает. Я попытался обернуть строку в блок 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>

Ответы [ 6 ]

17 голосов
/ 23 сентября 2008

Попробуйте, новый RegExp выдает исключение

Regex

    <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>

8 голосов
/ 23 сентября 2008

Проблема с этой строкой:

var grep = new RegExp('gr[');

'[' - специальный символ, поэтому его необходимо экранировать. Кроме того, эта строка не заключена в try ... catch, поэтому вы по-прежнему получаете сообщение об ошибке.

Редактировать : Вы также можете добавить

alert(e.message);

в предложении catch, чтобы увидеть сообщение об ошибке. Это полезно для всех видов ошибок в JavaScript.

Редактировать 2 : Хорошо, мне нужно было более внимательно прочитать вопрос, но ответ все еще там. В примере кода ошибочная строка не заключена в блок try ... catch. Я положил его туда и не получил ошибок в Opera 9.5, FF3 и IE7.

4 голосов
/ 23 сентября 2008
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');
2 голосов
/ 23 сентября 2008

установка инициализации 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.

1 голос
/ 23 сентября 2008

ваш RegExp не закрывает [

В моем FireFox он никогда не возвращается из конструктора - похоже на ошибку в реализации RegExp, но если вы предоставите правильное выражение, оно будет работать

0 голосов
/ 23 сентября 2008

Один из вариантов - проверить сгенерированные пользователем выражения. То есть; экранирующие символы, которые вы знаете, остановят ваш сценарий.

...