私はJavaScriptをもう少しエラープルーフにすることを探しています、そしてtry
、catch
、finally
、およびthrow
、しかし、いつ、どこでエラーをスローするかについて、専門家から大量のアドバイスを見つけられません。
また、素晴らしい章やエラー処理の詳細な説明がある本を聞くこともできます。 Eloquent JavaScript 問題に触れていますが、問題についてあまり規範的または意見を述べていません。
あなたが与えることができるアドバイスをありがとう!
エンタープライズJavaScriptエラー処理に関する非常に興味深いスライドセットは、 http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/ にあります。
要約すると、次のとおりです。
スライドはより詳細に説明されており、おそらくあなたに何らかの方向性を与えるでしょう。
更新
上記のプレゼンテーションはここにあります: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
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つのことに気付くでしょう。
ログエントリの急流を減らすことは、サーバーにログインする前に重大度や乱数をテストするのと同じくらい簡単です。
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 を使用してスタックトレースを返します)。
IHMO、他のいくつかの言語(私の知る限り:Python、Java)で行うように、javascriptでエラー処理を使用する必要があります。
読みやすくするため(そして、おそらく大きな影響があるかどうかはわかりませんが、おそらくパフォーマンスが向上します)、主に次の場合にtry/catchブロックを使用する必要があります。
コードのラップしたい部分はキーですアルゴリズム全体の一部。失敗した場合、次の可能性があります。
あなたが書いているコードはすべてのブラウザと互換性がないであることを知っている
最終的には、JavaScriptの専門家が他の要素を提供する場合があります。
ボックスに2セント、
よろしく、
マックス
他の答えに加えて、重要なことの1つは、JavaScriptエラーオブジェクトと_window.onerror
_関数パラメーターで利用可能なコンテキストデータを使用するを使用することです。
スタックトレース(errorObject.stack)、ファイル名、行番号、列番号など。各ブラウザにはいくつかの違いがあることに注意してください...そのため、ナイスエラーを取得するために最善を尽くしてください。
コンソールオブジェクト自体 に問題がある場合もあります。 これに触発されたカスタムwindow.onerror関数 と、 このコード に触発された特定の標準エラーオブジェクトを追跡する特別な関数を使用します。
もう1つの良い点は、Webアプリケーションのバージョンをスタックトレースに近い場所に含めることです(コピーをすばやく安全に貼り付けるため)。開発者はブラウザコンソールを絶えず監視せず、問題の一部を確認できないため、開発モードではエラーをより積極的に表示(アラート...)することもできます。
また、_throw 'My message'
_の使用を避け、throw new Error('My message')
を使用します。カスタムエラーが発生する場合もあります。 この記事 をお読みください。
常にエラー(バージョン、オブジェクトのID、カスタムメッセージなど)に何らかのコンテキストを追加し、外部エラー(外部データまたは強制的にシステムが故障した)と内部エラーを区別するようにしてください。/assertions(ご自身のシステムが台無しになった)、「 Design by contract 」について読んでください.
ガイド です。
ライブラリやフレームワークのインターセプターのような一般的なエラー処理の使用も検討してください。