2011-01-08 9 views
3

SpiderMonkeyを使用すると、条件付きキャッチブロックを使用して、例外を適切なハンドラにルーティングできます。V8のSpiderMonkeyのキャッチと等価です。

MDNから

try { 
// function could throw three exceptions 
getCustInfo("Lee", 1234, "[email protected]") 
} 
catch (e if e == "InvalidNameException") { 
// call handler for invalid names 
bad_name_handler(e) 
} 
catch (e if e == "InvalidIdException") { 
// call handler for invalid ids 
bad_id_handler(e) 
} 
catch (e if e == "InvalidEmailException") { 
// call handler for invalid email addresses 
bad_email_handler(e) 
} 
catch (e){ 
// don't know what to do, but log it 
logError(e) 
} 

の例では、しかし、V8で、このコードは文句を言わない、明白以外の任意の提案、または回避策をコンパイルします。

答えて

6

私が知る限り、他のJavaScriptエンジンには類似の機能はありません。

しかし、この機能使用してコードを変換するのは簡単です:ちょうど標準機能を使用してコードに

try { 
    A 
} catch (e if B) { 
    C 
} 

すべてのJavaScriptエンジンのサポートは:

try { 
    A 
} catch (e) { 
    if (B) { 
     C 
    } else { 
     throw e; 
    } 
} 

あなたが与えた例はさらに簡単ですが翻訳する:

try { 
    getCustInfo("Lee", 1234, "[email protected]"); 
} catch (e) { 
    if (e == "InvalidNameException") { 
     bad_name_handler(e); 
    } else if (e == "InvalidIdException") { 
     bad_id_handler(e); 
    } else if (e == "InvalidEmailException") { 
     bad_email_handler(e); 
    } else { 
     logError(e); 
    } 
} 
+1

明白なことは、スイッチのステートメントは、おそらくもっと良い、あなたのther eは似たような実装ではありませんか? –

+0

はい。 SpiderMonkeyの非標準的な拡張機能です。 –

+0

サイドノート:特定のタイプの例外をキャッチしたくない場合は、スタックトレースなどの処理は行いません。 –