JavaScript的Try/Catch

5
我有一个运行用户生成的正则表达式的函数。然而,如果用户输入无法运行的正则表达式,它就会停止并崩溃。我尝试将该行代码包装在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>

4
我至少校对了4次。这是一个别人擅长发现你可能自己都没发现的愚蠢错误的情况。 - Teifion
1
@Geoffrey:实际上,这是JavaScript。 - Andreas Grech
6个回答

17

尝试使用这个新的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>


8
问题出在这一行代码上:
var grep = new RegExp('gr[');

'['是一个特殊字符,所以需要转义。另外这行代码没有被包含在try...catch中,因此你仍然会收到错误提示。

编辑:你也可以添加一个

alert(e.message);

在catch子句中查看错误消息。这对于JavaScript中的所有类型的错误都很有用。
编辑2:好的,我需要仔细阅读问题,但答案仍然存在。在示例代码中,有问题的行没有包含在try...catch块中。我将其放在那里,在Opera 9.5、FF3和IE7中没有出现错误。

你错过了问题本身。 - Teifion
是的,我现在已经在Paul的回答中看到了。这只是我特别愚蠢的一个简单情况。无论如何,还是谢谢你的帮助 :) - Teifion

4
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
将RegExp的初始化放置在try/catch中可以解决问题(已在FireFox中测试)。

var grep, results;

try
{
    grep = new RegExp("gr["); // 在此处输入用户输入内容
}
catch(e)
{
    alert("RegExpr无效");
}

// 使用grep和results进行操作

在这里转义并不是解决方案。由于此代码段的目的是实际测试用户生成的RegExpr,因此您需要将 [ 视为未关闭的RegExpr容器进行捕获。

1

你的正则表达式没有关闭 [

在我的 FireFox 中,它从构造函数中永远不会返回 -- 看起来是 RegExp 实现中的一个 bug,但如果你提供一个有效的表达式,它就可以工作。


就像rslite一样,您错过了实际的问题,我想找到一种运行这样的正则表达式并捕获结果错误的方法。 - Teifion

0
一种选项是验证用户生成的表达式。也就是说,转义您知道会阻塞脚本的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接