Nodejs非同期異常処理domain
26804 ワード
前言
プログラム開発において、最も面倒なことの一つは異常処理です.Nodejsプログラムの開発に関して、最も面倒なことは異常処理に過ぎない.
MVCの多層構造の設計角度で、異常はいつも一層上に投げ出して、最後にクライアントで印刷エラーが発生します.しかし、Nodejsは例外的なステップです.try.catchはまったく捉えられません.私たちのプログラム設計に大きな迷惑をかけます.未処理のruntime異常がよくあります.システム全体を切断させます.
目次 Nodejs異常処理 Nodejs非同期異常処理 doman紹介 domanのAPI紹介 doman非同期異常例 1.Nodejs同期異常処理
システム環境 win 7 64 bit Nodejs:v 0.0.5 Npm:1.2.19 プロジェクトを作成
新規ファイル:sync.js,アナログ同期異常の処理
プログラムを実行
2.Nodejs非同期異常処理
新規ファイル:async.js、非同期異常処理をシミュレートします.
プログラムを実行
try.ccach、非同期を捕まえられない!
async.jsを修正し、process.on()を通じてエラー情報を印刷します.
3.domain紹介
nodeはv 0.8+バージョンの時、モジュールdomainをリリースしました.このモジュールが作ったのはtry catchではできないことです.非同期のフィードバックで発生した異常をキャッチします.
domainモジュールは、複数の異なるIOを扱う動作を一つのグループとします.登録イベントと返信はdomainになります.エラーイベントが発生したり、エラーが発生した場合、domainオブジェクトは通知されます.コンテキスト環境が失われないし、プログラムエラーも発生しないし、直ちにprocess.onとは異なります.
domainのリリースページhttp://nodejs.org/api/domain.html
domainで異常を捉えて、新しいファイルdomain.jsを作ります.
プログラムを実行
4.domainのAPI紹介
基本概念暗黙的なバインディング:domainコンテキストで定義された変数を、domainオブジェクト に自動的にバインディングする.明示的なバインディング:domainコンテキストで定義されていない変数をコードでdomainオブジェクト に結びつける.
APIの紹介 domann.creat():domailオブジェクト を返します. domann.run(fn):domainコンテキストで関数を実行し、すべてのイベント、タイマー、および低レベルの要求を暗黙的にバインディングする. domann.members:domainオブジェクトのドメインタイマーとイベント送信機の配列が追加されました. domann.add:明示的な増加イベント domann.remove:削除イベント domann.bind:returnをパッケージにcalback関数 domann.intercept:同じdomann.bindですが、最初のパラメータ だけ戻ります. domann.enter():非同期呼出のコンテキストに入り、domain に結び付けられる. domann.exit():現在のdomainを終了し、異なるチェーンの非同期呼出のコンテキストに切り替えます.対応domann.enter() domann.dispose():domainオブジェクトをリリースして、nodeプロセスにこの部分のリソースを回収させます.
5.domain非同期異常特例
以下の例では、domainは非同期異常を捉えられないだろう.
プログラムを実行
プログラムコードの変更
domainモジュールを通して、Nodejsシステムの異常管理をよく設計できます.
記事の転載は:http://blog.fens.me/nodejs-core-domain/ › いい文章を見ました.自分でも分かります.思い切って転載して、勉強して収録します.
プログラム開発において、最も面倒なことの一つは異常処理です.Nodejsプログラムの開発に関して、最も面倒なことは異常処理に過ぎない.
MVCの多層構造の設計角度で、異常はいつも一層上に投げ出して、最後にクライアントで印刷エラーが発生します.しかし、Nodejsは例外的なステップです.try.catchはまったく捉えられません.私たちのプログラム設計に大きな迷惑をかけます.未処理のruntime異常がよくあります.システム全体を切断させます.
目次
システム環境
~ D:\workspace\javascript>mkdir nodejs-domain && cd nodejs-domain
新規ファイル:sync.js,アナログ同期異常の処理
~ vi sync.js
function sync_error() {
var r = Math.random() * 10;
console.log("random num is " + r);
if (r > 5) {
throw new Error("Error: random num" + r + " > 5");
}
}
setInterval(function () {
try {
sync_error();
} catch (err) {
console.log(err);
}
}, 1000)
プログラムを実行
~ D:\workspace\javascript
odejs-domain>node sync.js
random num is 1.067440479528159
random num is 6.284254263155162
[Error: Error: random num6.284254263155162 > 5]
random num is 8.445568478200585
[Error: Error: random num8.445568478200585 > 5]
random num is 2.79862868366763
random num is 5.452311446424574
[Error: Error: random num5.452311446424574 > 5]
random num is 3.725348354782909
random num is 7.590636070817709
[Error: Error: random num7.590636070817709 > 5]
random num is 9.584896392188966
[Error: Error: random num9.584896392188966 > 5]
random num is 3.63708304008469
random num is 5.747077965643257
[Error: Error: random num5.747077965643257 > 5]
random num is 1.0771577199921012
random num is 8.898805833887309
[Error: Error: random num8.898805833887309 > 5]
random num is 6.59792885184288
[Error: Error: random num6.59792885184288 > 5]
random num is 1.8532328261062503
random num is 3.6028534593060613
random num is 2.7523675211705267
random num is 1.598257850855589
try.catchを通じて同期プログラムの異常をよく把握できます.2.Nodejs非同期異常処理
新規ファイル:async.js、非同期異常処理をシミュレートします.
~ vi async.js
function async_error() {
setTimeout(function(){
var r = Math.random() * 10;
console.log("random num is " + r);
if (r > 5) {
throw new Error("Error: random num" + r + " > 5");
}
},10)
}
setInterval(function () {
try {
async_error();
} catch (err) {
console.log(err);
}
}, 1000)
プログラムを実行
~ D:\workspace\javascript
odejs-domain\sync.js:5
throw new Error("Error: random num" + r + " > 5");
^
Error: Error: random num9.974474618211389 > 5
at trycatch (D:\workspace\javascript
odejs-domain\sync.js:5:15)
at Timer. (D:\workspace\javascript
odejs-domain\sync.js:10:5)
at Timer.timer.ontimeout (timers.js:247:14)
try.ccach、非同期を捕まえられない!
async.jsを修正し、process.on()を通じてエラー情報を印刷します.
~ vi async.js
function async_error() {
setTimeout(function(){
var r = Math.random() * 10;
console.log("random num is " + r);
if (r > 5) {
throw new Error("Error: random num" + r + " > 5");
}
},10)
}
setInterval(function () {
try {
async_error();
} catch (err) {
console.log(err);
}
}, 1000)
process.on('uncaughtException', function (err) {
console.log(err);
});
プログラムを実行~ D:\workspace\javascript
odejs-domain>node async.js
random num is 9.33843155624345
[Error: Error: random num9.33843155624345 > 5]
random num is 7.894433259498328
[Error: Error: random num7.894433259498328 > 5]
random num is 2.532815719023347
random num is 6.0961083066649735
[Error: Error: random num6.0961083066649735 > 5]
random num is 5.138748907484114
[Error: Error: random num5.138748907484114 > 5]
プロcess.onの内蔵関数によって、この間違ったログを記録することができます.そして、プロセスは異常に終了しません.しかし、エラーを発見したことに対して友好的に返してもらうことはできません.タイムアウトだけで戻ってきます.3.domain紹介
nodeはv 0.8+バージョンの時、モジュールdomainをリリースしました.このモジュールが作ったのはtry catchではできないことです.非同期のフィードバックで発生した異常をキャッチします.
domainモジュールは、複数の異なるIOを扱う動作を一つのグループとします.登録イベントと返信はdomainになります.エラーイベントが発生したり、エラーが発生した場合、domainオブジェクトは通知されます.コンテキスト環境が失われないし、プログラムエラーも発生しないし、直ちにprocess.onとは異なります.
domainのリリースページhttp://nodejs.org/api/domain.html
domainで異常を捉えて、新しいファイルdomain.jsを作ります.
~ vi domain.js
var domain = require('domain');
function sync_error() {
var r = Math.random() * 10;
console.log("sync num is " + r);
if (r > 5) {
throw new Error("sync: random num" + r + " > 5");
}
}
function async_error() {
setTimeout(function(){
var r = Math.random() * 10;
console.log("async num is " + r);
if (r > 5) {
throw new Error("async: random num" + r + " > 5");
}
},10)
}
var d = domain.create();
d.on('error',function(err){
console.log(err);
});
setInterval(function () {
d.run(sync_error);
d.run(async_error);
}, 1000)
プログラムを実行
~ D:\workspace\javascript
odejs-domain>node domain.js
sync num is 8.492766928393394
{ [Error: sync: random num8.492766928393394 > 5]
domain:
{ domain: null,
_events: { error: [Function] },
_maxListeners: 10,
members: [] },
domainThrown: true }
sync num is 4.991524459328502
async num is 7.5735537661239505
{ [Error: async: random num7.5735537661239505 > 5]
domain:
{ domain: null,
_events: { error: [Function] },
_maxListeners: 10,
members: [] },
domainThrown: true }
sync num is 4.626072463579476
async num is 9.48660139227286
{ [Error: async: random num9.48660139227286 > 5]
domain:
{ domain: null,
_events: { error: [Function] },
_maxListeners: 10,
members: [] },
domainThrown: true }
sync num is 2.3057156521826982
async num is 4.5645097037777305
sync num is 2.0251641585491598
async num is 7.712894310243428
{ [Error: async: random num7.712894310243428 > 5]
domain:
{ domain: null,
_events: { error: [Function] },
_maxListeners: 10,
members: [] },
domainThrown: true }
domanを発見しました.同期異常(sync)と非同期異常(async)を同時に捉えることができます.4.domainのAPI紹介
基本概念
APIの紹介
5.domain非同期異常特例
以下の例では、domainは非同期異常を捉えられないだろう.
var domain = require('domain');
var EventEmitter = require('events').EventEmitter;
var e = new EventEmitter();
var timer = setTimeout(function () {
e.emit('data');
}, 10);
function next() {
e.once('data', function () {
throw new Error('Receive data error!');
});
}
var d = domain.create();
d.on('error', function (err) {
console.log(err);
});
d.run(next);
プログラムを実行
~ D:\workspace\javascript
odejs-domain\special.js:12
throw new Error('Receive data error!');
^
Error: Receive data error!
at EventEmitter. (D:\workspace\javascript
odejs-domain\special.js:12:15)
at EventEmitter.g (events.js:175:14)
at EventEmitter.emit (events.js:92:17)
at null._onTimeout (D:\workspace\javascript
odejs-domain\special.js:7:7)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
timerとeの二つのキーの対象が初期化時にdomainの範囲内にない場合、next関数で傍受されたイベントがトリガされ、異常なコールバック関数が実行されると、domainの小包の中にはまったくないです.プログラムコードの変更
var domain = require('domain');
var EventEmitter = require('events').EventEmitter;
var e = new EventEmitter();
var timer = setTimeout(function () {
e.emit('data');
}, 10);
function next() {
e.once('data', function () {
throw new Error('Receive data error!');
});
}
var d = domain.create();
d.on('error', function (err) {
console.log(err);
});
d.add(e);
d.add(timer);
d.run(next);
eとtimerをdomainの範囲に追加して、プログラムを実行します.~ D:\workspace\javascript
odejs-domain>node special.js
{ [Error: Receive data error!]
domain:
{ domain: null,
_events: { error: [Function] },
_maxListeners: 10,
members: [ [Object], [Object] ] },
domainThrown: true }
domain特例コード摘出:http://cnodejs.org/topic/516b64596d38277306407936domainモジュールを通して、Nodejsシステムの異常管理をよく設計できます.
記事の転載は:http://blog.fens.me/nodejs-core-domain/ › いい文章を見ました.自分でも分かります.思い切って転載して、勉強して収録します.