2012-01-24 15 views
14

私はJavaScriptを学び始めていますが、これまでのところ問題はありませんが、私はJSのExceptionメカニズムの良い説明を見つけるのは難しいです。さまざまな種類の例外を区別するにはどうすればよいですか?

JSはC++に似ていますが、JSは例外オブジェクトを投げるのではなく(おそらく動的な性質のため)、あらゆるオブジェクトを投げることができます。

throw 'An error occured.'; 

作品だけでなく、

throw new Exception('An error occured.'); 

catchfinallyの両方が彼らのJava同等のように動作するように見えます。それでも、例外に関するベストプラクティスが広く受け入れられているかどうかはわかりません。

ので、例えば、同様に、文字列型のオブジェクトをスローすることが合法である:私は例外の異なる種類を区別する方法を

throw 'An error occured'; 

+0

質問を絞り込む必要があります。何の面でベストプラクティス? –

答えて

12

例外をスローしてキャッチするのはかなりコストがかかります.JavaScriptでは、書式設定されていないJSON文字列を解析しようとすると、主に例外が発生します。私はできるだけtry/catchを避けることをお勧めします。代わりにC++よりも例外が発生する可能性が低いので、古いファッションの方法(戻り値の型、変数を使用する前に変数が適切に初期化されていることなどを確認する)または特にJavaまたは.NET。

Andy E's recommendationは、実際にそれらを処理するのに適していますが、一般的には、try/catchする必要がないように慎重にJavaScriptコードを記述してください。覚えておいても、JITed Chrome(最も速いエンジン)のJavaScriptでもJavaやC#と比べると遅いですが、C++の何も言わないので、これらの言語では高価なものはJavaScriptの方がはるかに多くなります。

+0

+1、私はまれにこれを書く必要はありませんが、try/catchステートメントに対しては勧めません。 try/catchが必要な理由の1つは、(IEの 'ActiveXObjects'のような)インスタンス化されていない、またはインスタンス化できないホストオブジェクトを扱うときです。 –

15

「ベストプラクティス」は、例外の原因となった問題に関連する正しいタイプのErrorオブジェクトをスローすることです。 ECMAScriptはいくつかのタイプの例外オブジェクトを定義します。これらのオブジェクトはすべてErrorから継承されます。これらのオブジェクトはEvalError,RangeError,ReferenceError,TypeErrorおよびURIErrorです。含め、いくつかの理由で私のように貧しい人々の練習を打つ例外オブジェクトを使用せずにthrow文を使用して、一般的に

try { 
    // do something 
} 
catch (e) { 
    if (e instanceof TypeError) { 
     // do something else 
    } 
} 

これらのコンストラクタ

は、あなたがこのような何かを行うことが可能にする、ネイティブのECMAScriptの機能で使用されています:例外プリミティブを受信し、 Errorオブジェクトを期待することができる処理するように設計

  • コードは変更せず、予期しない副作用または例外を処理することができないことをもたらすことができます処理コード。これの例は、スロー式の結果にstackプロパティがないことです。 try/catchステートメントで使用されていない
  • は、インターネットエクスプローラー8と下にはメッセージを表示して、スローするようにあなたの試みで異なる例外がスローされます、「例外がスローされ、キャッチされない」*。これは、開発者ツールを使用してデバッグしている場合、またはグローバル例外ハンドラをwindow.onerrorに設定している場合、さらに混乱する可能性があります。

したがって、通常、インスタンスErrorまたはその継承オブジェクトを正しくスローするようにしてください。

* nbでは、IEはErrorから直接構築されないErrorオブジェクトの種類に対してもこれを行います。はい、私はそれが愚かだと知っていますが、彼らはIE 9でそれを修正しました。

+6

'throw 'は、本当の 'Error'インスタンスでなく純粋なRAGEであれば' catch'で返されたエラーが '.stack'プロパティを持たないという理由から、アンチパターンです。さて、try/catch/throwはJSの一般的なパフォーマンスのパターンであり、可能な場合は避けるべきです。 – Raynos

2

AJAXアプリを構築する場合、例外はあまり役に立ちません。AJAX操作の非同期性に、エラー処理を使用すると、上記のコードで

function save_data(){ 
    try { 
     ajax(some_ulr, function(){ 
      //callback 
      do_wrong_thing(); 
     }); 
    } catch(e){ 
     handler_error(); 
    } 
} 

を期待することとして、do_wrong_thingによる誤差がキャッチセクションをトリガしません動作しません。

+2

また、非同期コードは、「復帰」を中断しますが、そのようになると予想されます。 – hugomg

関連する問題