ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js 例外処理_node.js でのドメイン モジュールの使用を分析する
NodeJS は、非同期コードでの例外処理を簡素化するドメイン モジュールを提供します。このモジュールを導入する前に、まず「ドメイン」の概念を理解する必要があります。簡単に言えば、ドメインは JS 実行環境であり、実行環境では例外がキャッチされない場合、グローバル例外としてスローされます。 NodeJS は、プロセス オブジェクトを通じてグローバル例外をキャプチャするメソッドを提供します。サンプル コードは次のとおりです
。process.on('uncaughtException', function (err) { console.log('Error: %s', err.message); }); setTimeout(function (fn) { fn(); });
Error: undefined is not a function
グローバル例外にはキャッチできる場所がありますが、ほとんどの例外については、できるだけ早くキャッチし、結果に基づいてコードの実行パスを決定したいと考えています。例として次の HTTP サーバー コードを使用します:
function async(request, callback) { // Do something. asyncA(request, function (err, data) { if (err) { callback(err); } else { // Do something asyncB(request, function (err, data) { if (err) { callback(err); } else { // Do something asyncC(request, function (err, data) { if (err) { callback(err); } else { // Do something callback(null, data); } }); } }); } }); } http.createServer(function (request, response) { async(request, function (err, data) { if (err) { response.writeHead(500); response.end(); } else { response.writeHead(200); response.end(data); } }); });
上記のコードはリクエストオブジェクトを非同期関数に渡して処理し、処理結果に応じたレスポンスを返します。ここでは例外を渡すためにコールバック関数を使用しているため、async 関数内にさらにいくつかの非同期関数呼び出しがある場合、コードは上記のようになります。コードの見栄えを良くするために、リクエストが処理されるたびにドメイン モジュールを使用してサブドメイン (JS サブランタイム環境) を作成できます。サブドメインで実行されているコードは任意に例外をスローでき、これらの例外はサブドメイン オブジェクトのエラー イベントを通じて均一にキャプチャできます。したがって、上記のコードは次のように変更できます:
function async(request, callback) { // Do something. asyncA(request, function (data) { // Do something asyncB(request, function (data) { // Do something asyncC(request, function (data) { // Do something callback(data); }); }); }); } http.createServer(function (request, response) { var d = domain.create(); d.on('error', function () { response.writeHead(500); response.end(); }); d.run(function () { async(request, function (data) { response.writeHead(200); response.end(data); }); }); });
ご覧のとおり、.create メソッドを使用してサブドメイン オブジェクトを作成し、.run メソッドを使用してサブドメインで実行する必要があるコードのエントリ ポイントを入力します。サブドメインにある非同期関数のコールバック関数は例外をキャッチする必要がなくなったため、コードが突然大幅にスリムになります。
トラップ
グローバル例外がプロセス オブジェクトの uncaughtException イベントを通じてキャプチャされるか、サブドメイン例外がサブドメイン オブジェクトのエラー イベントを通じてキャプチャされるかに関係なく、NodeJS 公式ドキュメントでは、例外を処理した後は、プログラムを再起動するのではなく、すぐにプログラムを再起動することを強く推奨しています。プログラムを実行し続けます。公式ドキュメントによると、例外が発生した後のプログラムは、すぐに終了しないと、深刻なメモリ リークが発生したり、異常な動作をしたりする可能性があります。
しかし、ここでいくつかの事実を明らかにする必要があります。 JS 自体の throw..try..catch 例外処理メカニズムはメモリ リークを引き起こしたり、プログラムの実行結果が予期せぬものになることはありませんが、NodeJS は純粋な JS ではありません。 NodeJS の多数の API は内部的に C/C++ で実装されているため、NodeJS プログラムの実行中にコード実行パスが JS エンジンの内部と外部の間を往復し、JS の例外スロー メカニズムによってプログラムが中断される場合があります。これにより、C/C++ 部分のコードが異常に動作し、メモリ リークやその他の問題が発生します。
したがって、コードの実行パスに C/C++ コードが含まれる場合、メモリ リークやその他の問題が発生するかどうかわからない場合は、例外を処理した後にプログラムを再起動することをお勧めします。 。 try ステートメントを使用して例外をキャッチする場合、通常、キャッチされる例外は JS 自体の例外であるため、アピールについて心配する必要はありません。