2008-09-23 97 views
5

我有一个运行用户生成正则表达式的函数。但是,如果用户输入一个不会运行的正则表达式,那么它会停下来并摔倒。我试过在Try/Catch块中包装行,但没有任何反应。Javascript 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 2008-09-23 12:46:41

+1

@Geoffrey:其实它是JavaScript。 – 2010-10-27 08:51:25

回答

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中,所以你仍然得到错误。

编辑:您也可以在catch子句中添加

alert(e.message); 

看到错误消息。这对JavaScript中的所有错误都很有用。

编辑2:OK,我需要更仔细地阅读的问题,但答案依然存在。在示例代码中,违规行不包含在try ... catch块中。我把它放在那里,并没有在Opera 9.5,FF3​​和IE7中出错。

+0

你已经错过了这个问题本身 – Teifion 2008-09-23 12:41:09

1

你的正则表达式不关闭[

在我的Firefox,它永远不会从构造函数返回 - 看起来像正则表达式的实现中的错误,但是如果你提供一个有效的表达式,它的工作原理

0

一种选择是,以验证用户生成的表达式。那是;你知道的转义字符将会拖延你的脚本。

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

把试内部的正则表达式的初始化/ 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容器。