1

私の質問は単純ですが、Javascript VM に依存します。

ReferenceError をキャッチするとき (私の場合は eval(...) を実行するとき)、エラー オブジェクトから実際の識別子トークンを取得するにはどうすればよいですか?

「既知の」エラー メッセージを照合して解析するのは、私にはハックすぎるように思えますが、現在私が利用できる唯一のオプションです。

編集:今のところ、これを行うことでV8とFirefoxを「一致」させているだけです:

catch(e){
    if (e.name === "ReferenceError"){
       var varname = e.toString().replace("ReferenceError: ","")
                      .replace(" is not defined","").trim();
       foobar(varname);
    }
 }
4

1 に答える 1

1

e.message最初のスペースまでテキストを使用して一致させることができるはずです。

次のコードは、IE7/IE8/IE9/IE10/Chrome および Firefox で動作します。

try {
    alert(tesssst);
} catch(e){
    if (e.name === "ReferenceError" || e.name === "TypeError") { //IE7 uses TypeError instead
        var variableName = e.message.substr(0, e.message.indexOf(" "));

        //IE7 and IE8 fix (it adds ' around the variable name)
        if (variableName.substr(0, 1) == "'" && variableName.substr(variableName.length - 1) == "'") {
            variableName = variableName.substr(1, variableName.length - 2);
        }

        console.log(variableName); //tesssst
    }
}

編集
IE7 / IE8の修正を追加

編集 2 :
少しの正規表現マジックを使用すると、これを次のように変更できます。

try {
    alert(tesssst);
} catch(e){
    if (e.name === "ReferenceError" || e.name === "TypeError") { //IE7 uses TypeError instead
        var variableName = e.message.match(/^'?(.*?)'? /)[1];
        console.log(variableName);
    }
} 
于 2013-07-12T14:49:34.247 に答える