JavaScript のトライ/キャッチ
-
02-07-2019 - |
質問
ユーザーが生成した正規表現を実行する関数があります。ただし、ユーザーが実行されない正規表現を入力すると、停止して終了します。Try/Catch ブロックで行をラップしようとしましたが、残念ながら何も起こりません。
それが役立つ場合は、私は jQuery を実行していますが、それよりももう少し基本的なものであると推測しているため、以下のコードには 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>
解決
新しい 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>
他のヒント
問題は次の行にあります。
var grep = new RegExp('gr[');
「[」は特殊文字なのでエスケープする必要があります。また、この行は try...catch でラップされていないため、依然としてエラーが発生します。
編集:を追加することもできます
alert(e.message);
catch 句内でエラー メッセージを確認します。JavaScript のあらゆる種類のエラーに役立ちます。
編集2:質問をもっと注意深く読む必要がありましたが、答えはまだあります。コード例では、問題のある行は try...catch ブロックで囲まれていません。そこに入れてみましたが、Opera 9.5、FF3、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');
RegExp の初期化を try/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 コンテナーとしてキャッチする必要があります。
RegExp が閉じていません [
私の FireFox では、コンストラクターから返されません。RegExp の実装のバグのように見えますが、有効な式を指定すると機能します。
1 つのオプションは、ユーザーが生成した式を検証することです。あれは;エスケープ文字を使用するとスクリプトが停止する可能性があります。