2008-09-23 7 views
5

J'ai une fonction qui exécute un Regex généré par l'utilisateur. Cependant, si l'utilisateur entre une regex qui ne s'exécutera pas, il s'arrête et tombe. J'ai essayé d'emballer la ligne dans un bloc Try/Catch mais hélas, rien ne se passe. Si cela peut aider, je lance jQuery mais le code ci-dessous ne l'a pas comme je suppose que c'est un peu plus fondamental que cela. Edit: Oui, je sais que je n'échappe pas au "[", c'est intentionnel et le point de la question. J'accepte l'entrée de l'utilisateur et je veux trouver un moyen d'attraper ce genre de problème sans que l'application tombe à plat sur son visage.Javascript Try/Catch

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

Je l'ai fait relire, au moins 4 fois. C'est un cas de quelqu'un d'autre qui est tellement mieux à repérer cette erreur stupide que vous faites, vous l'avez peut-être rencontré vous-même. – Teifion

+1

@Geoffrey: En fait, c'est JavaScript. –

Répondre

17

Essayez ce nouveau RegExp jette l'exception

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

Le problème est avec cette ligne:

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

'[' est un caractère spécial il doit être échappé. De plus, cette ligne n'est pas enveloppée dans try ... catch, donc vous obtenez toujours l'erreur.

Modifier: Vous pouvez également ajouter un

alert(e.message); 

dans la clause catch pour voir le message d'erreur. C'est utile pour tous les types d'erreurs en javascript.

Modifier 2: OK, j'avais besoin de lire plus attentivement la question, mais la réponse est toujours là. Dans l'exemple de code, la ligne incriminée n'est pas encapsulée dans le bloc try ... catch. Je l'ai mis là et n'ai pas eu d'erreurs dans Opera 9.5, FF3 et IE7.

+0

Vous avez manqué la question elle-même – Teifion

+0

Oui, j'ai vu ça maintenant dans la réponse de Paul. C'était un cas simple de moi étant plus stupide. Merci pour l'aide de toute façon :) – Teifion

1

votre RegExp ne ferme pas la [

Dans mon FireFox, il ne retourne jamais du constructeur - ressemble à un bogue dans la mise en œuvre de RegExp, mais si vous fournissez une expression valide, cela fonctionne

+0

Comme avec rslite, vous avez manqué la vraie question, je veux trouver un moyen d'exécuter une telle regex et attraper l'erreur résultante – Teifion

0

Une option est de valider les expressions générées par l'utilisateur. C'est; les caractères d'échappement que vous connaissez vont bloquer votre script.

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

mettre l'initialisation RegExp à l'intérieur du try/catch fonctionnera (juste testé dans 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 
 

Échapper ici n'est pas la solution. Puisque le but de cet extrait est de tester réellement un RegExPr généré par l'utilisateur, vous devrez attraper [comme un conteneur RegExpr non fermé.