Javascript try / catch
-
02-07-2019 - |
Pergunta
Eu tenho uma função que executa um usuário gerado Regex. No entanto, se o usuário entra em um regex que não será executado em seguida, ele pára e cai. Eu tentei envolvendo a linha em um bloco try / catch, mas infelizmente nada acontece.
Se ajudar, eu estou correndo jQuery mas o código abaixo não tê-lo como eu estou supondo que é um pouco mais fundamental do que isso.
Edit: Sim, eu sei que não estou fugindo da "[", que é intencional e o ponto da questão. Estou aceitando a entrada do usuário e quero encontrar uma maneira de travar este tipo de problema sem a cair de aplicação nele é cara.
<!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>
Solução
Tente este novo RegExp é lançar a exceção
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>
Outras dicas
O problema é com esta linha:
var grep = new RegExp('gr[');
'[' é um caractere especial para que ele precisa ser escapado. Também esta linha não é envolto em try ... catch, assim você ainda obter o erro.
Editar : Você também pode adicionar um
alert(e.message);
na cláusula catch para ver a mensagem de erro. É útil para todos os tipos de erros em javascript.
Editar 2 : OK, eu precisava ler mais atentamente a questão, mas a resposta ainda está lá. No código de exemplo a linha ofensiva não é envolvida no bloco try ... catch. Eu colocá-lo lá e não obter erros no Opera 9.5, FF3 e 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');
colocando a inicialização RegExp dentro do try / catch irá funcionar (apenas testada no 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
Escapando aqui não é a solução. Uma vez que o objectivo deste trecho é de realmente testar um RegExpr gerado pelo usuário, você vai querer pegar [como um recipiente RegExpr não fechada.
seu RegExp não fecha a [
Na minha FireFox, nunca retorna a partir do construtor - parece um bug na implementação de RegExp, mas se você fornecer uma expressão válida, ele funciona
Uma opção é validar as expressões gerado pelo usuário. Isso é; escapar caracteres que você sabe que vai parar o seu script.