web-dev-qa-db-ja.com

JavaScriptエラー処理のベストプラクティスは何ですか?

私はJavaScriptをもう少しエラープルーフにすることを探しています、そしてtrycatchfinally、およびthrow、しかし、いつ、どこでエラーをスローするかについて、専門家から大量のアドバイスを見つけられません。

  • すべてのコードをtry/catchでラップする必要がありますか?
  • this on のようなアドバイスはありますか?どの時点でエラーをキャッチする必要がありますか?
  • 本番環境でコードを静かに失敗させるのではなく、エラーを発生させることの欠点はありますか?
  • これは、実装に関してはSOで触れられていますが、サーバーロギングJSエラーは効果的な戦略ですか?
  • アプリケーションでエラーをトラップすることに関して、他に知っておくべきことはありますか?

また、素晴らしい章やエラー処理の詳細な説明がある本を聞くこともできます。 Eloquent JavaScript 問題に触れていますが、問題についてあまり規範的または意見を述べていません。

あなたが与えることができるアドバイスをありがとう!

128
Joshua Cody

エンタープライズJavaScriptエラー処理に関する非常に興味深いスライドセットは、 http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/ にあります。

要約すると、次のとおりです。

  1. コードが失敗すると仮定する
  2. エラーをサーバーに記録する
  3. ブラウザではなく、あなたがエラーを処理します
  4. エラーが発生する可能性のある場所を特定する
  5. 独自のエラーを投げる
  6. 致命的エラーと非致命的エラーを区別する
  7. デバッグモードを提供する

スライドはより詳細に説明されており、おそらくあなたに何らかの方向性を与えるでしょう。

更新

上記のプレゼンテーションはここにあります: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation

58
cdmdotnet

Yahoo!のニコラス・ザカス名声はAjax Experience 2008でエンタープライズエラー処理( slides )で講演しました。

function log(sev,msg) {
    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

// usage
log(1, "Something bad happened.")

// Auto-log uncaught JS errors
window.onerror = function(msg, url, line) {
    log(1, msg);
    return true;
}

1年後、Nicholas Zakasは 彼のブログの更新 を投稿しました。これには、実稼働環境にエラー処理コードを自動的に挿入する巧妙なパターンが含まれています(アスペクト指向プログラミングを使用)。

Window.error呼び出しのロギングを開始すると、次の2つのことに気付くでしょう。

  1. サイトがかなり複雑な場合は、エラーのlotをログに記録します
  2. たくさんの役に立たない「window.error in undefined:0」メッセージが表示されます。

ログエントリの急流を減らすことは、サーバーにログインする前に重大度や乱数をテストするのと同じくらい簡単です。

function log(sev,msg) {
    if (Math.random() > 0.1) return; // only log some errors

    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

役に立たない「window.error in undefined:0」エラーの処理はサイトのアーキテクチャに依存しますが、すべてのAjax呼び出しを特定し、何かが失敗した場合に例外をスローしようとします(おそらく stacktrace.js を使用してスタックトレースを返します)。

30
Jens Roland

IHMO、他のいくつかの言語(私の知る限り:Python、Java)で行うように、javascriptでエラー処理を使用する必要があります。

読みやすくするため(そして、おそらく大きな影響があるかどうかはわかりませんが、おそらくパフォーマンスが向上します)、主に次の場合にtry/catchブロックを使用する必要があります。

  • コードのラップしたい部分はキーですアルゴリズム全体の一部。失敗した場合、次の可能性があります。

    • コードの次の部分にエラーを作成します(たとえば、varがないため...)
    • ページが期待どおりに表示されないようにする(コンテンツまたはCSSに影響)
    • 結果がユーザーにとって奇妙に見えるようにする(コードの動作に影響する)
  • あなたが書いているコードはすべてのブラウザと互換性がないであることを知っている

  • コードが失敗する可能性がある(if ... then ...ブロックで動作することを確認する他の方法がないため)
  • また、最終ユーザーを煩わせることなくdebugにしたい場合

最終的には、JavaScriptの専門家が他の要素を提供する場合があります。

ボックスに2セント、

よろしく、

マックス

7
JMax

他の答えに加えて、重要なことの1つは、JavaScriptエラーオブジェクトと_window.onerror_関数パラメーターで利用可能なコンテキストデータを使用するを使用することです。

スタックトレース(errorObject.stack)、ファイル名、行番号、列番号など。各ブラウザにはいくつかの違いがあることに注意してください...そのため、ナイスエラーを取得するために最善を尽くしてください。

コンソールオブジェクト自体 に問題がある場合もあります。 これに触発されたカスタムwindow.onerror関数 と、 このコード に触発された特定の標準エラーオブジェクトを追跡する特別な関数を使用します。

もう1つの良い点は、Webアプリケーションのバージョンをスタックトレースに近い場所に含めることです(コピーをすばやく安全に貼り付けるため)。開発者はブラウザコンソールを絶えず監視せず、問題の一部を確認できないため、開発モードではエラーをより積極的に表示(アラート...)することもできます。

また、_throw 'My message'_の使用を避け、throw new Error('My message')を使用します。カスタムエラーが発生する場合もあります。 この記事 をお読みください。

常にエラー(バージョン、オブジェクトのID、カスタムメッセージなど)に何らかのコンテキストを追加し、外部エラー(外部データまたは強制的にシステムが故障した)と内部エラーを区別するようにしてください。/assertions(ご自身のシステムが台無しになった)、「 Design by contract 」について読んでください.

ガイド です。

ライブラリやフレームワークのインターセプターのような一般的なエラー処理の使用も検討してください。

4