Javascript Try / Catch
-
02-07-2019 - |
Domanda
Ho una funzione che esegue un Regex generato dall'utente. Tuttavia, se l'utente inserisce una regex che non verrà eseguita, si arresterà e cadrà. Ho provato a avvolgere la linea in un blocco Try / Catch ma purtroppo non succede nulla.
Se aiuta, sto eseguendo jQuery ma il codice qui sotto non ce l'ha perché immagino che sia un po 'più fondamentale di così.
Modifica: Sì, so che non sto sfuggendo al " [" ;, che è intenzionale e il punto della domanda. Sto accettando l'input dell'utente e voglio trovare un modo per risolvere questo tipo di problema senza che l'applicazione si stacchi sulla sua faccia.
<!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>
Soluzione
Prova questo il nuovo RegExp lancia l'eccezione
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>
Altri suggerimenti
Il problema è con questa riga:
var grep = new RegExp('gr[');
'[' è un personaggio speciale, quindi deve essere evaso. Anche questa riga non è racchiusa in try ... catch, quindi ricevi ancora l'errore.
Modifica : puoi anche aggiungere un
alert(e.message);
nella clausola catch per vedere il messaggio di errore. È utile per tutti i tipi di errori in JavaScript.
Modifica 2 : OK, avevo bisogno di leggere più attentamente la domanda, ma la risposta è ancora lì. Nel codice di esempio la linea offensiva non è racchiusa nel blocco try ... catch. L'ho messo lì e non ho ricevuto errori in 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');
inserendo l'inizializzazione RegExp in try / catch funzionerà (appena testato in 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
Scappare qui non è la soluzione. Poiché lo scopo di questo frammento è effettivamente testare un RegExpr generato dall'utente, ti consigliamo di catturare [come contenitore RegExpr non chiuso.
il tuo RegExp non chiude il [
Nel mio FireFox, non ritorna mai dal costruttore - sembra un bug nell'implementazione di RegExp, ma se si fornisce un'espressione valida, funziona
Un'opzione è convalidare le espressioni generate dall'utente. Questo è; i caratteri di escape che sai bloccheranno la tua sceneggiatura.