ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js 例外処理_node.js でのドメイン モジュールの使用を分析する

Node.js 例外処理_node.js でのドメイン モジュールの使用を分析する

WBOY
WBOYオリジナル
2016-05-16 15:15:222015ブラウズ

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 自体の例外であるため、アピールについて心配する必要はありません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。