domainsを触ってみたよ

domainsの記事をあまり読まない気がしたので、ちょっと使ってみたりしました。
環境:OS X 10.7.5 / node.js 0.8.6

基本的なところ

基本的なところとして、大体以下のようにしてドメインを作成し、そのドメインのエラーハンドラを登録します。

#!/usr/bin/env node

var domain = require('domain'),
    testDomain = domain.create();

// エラーが発生した際の処理を書く
testDomain.on('error', function (err) {
  console.error('test error: %s', err.message);
});

あとは他の関数でエラーハンドリングする範囲を決める感じ?と言えば良いのかな。

domain#intercept

最初にinterceptです。いきなりコードを以下に。

#!/usr/bin/env node

var domain = require('domain'),
    fs = require('fs'),
    readFileDomain = domain.create();

readFileDomain.on('error', function (err) {
  console.error('readFile error: %s', err.message);
});

fs.readFile('./aaa', 'utf8', readFileDomain.intercept(function (err, data) {
  console.log(data);
}));
fs.readFile('./bbb', 'utf8', readFileDomain.intercept(function (err, data) {
  console.log(data);
}));
fs.readFile('./ccc', 'utf8', readFileDomain.intercept(function (err, data) {
  console.log(data);
}));

fs#readFileが3つほどありますが、それのエラーをreadFileDomainで受け取っています。
いつもコールバックを書いている部分にdomain#interceptに渡すように書いてあげてるだけですねー。

if (err) throw err;

を書かなくて良くなった上に、エラー処理がまとまりました。


domain#run

最後にrunを。

#!/usr/bin/env node

var domain = require('domain'),
    fs = require('fs'),
    mainDomain = domain.create();

mainDomain.on('error', function (err) {
  console.error('mainDomain error: %s', err.message);
});

mainDomain.run(function () {
  setInterval(function () {
    fs.readFile('./aaa', function (err, data) {
      if (err) throw err;
    });
    process.nextTick(function () {
      console.log('aaa');
    });
  }, 1000);
});

domain#run内で投げられたエラーをmainDomainですべて処理している……はず!


とまあ、uncaughtExceptionだと広すぎるけれど、domainsを使って適切な範囲でエラーハンドリングできれば、その範囲でエラーログを出力したりだとかエラーの箇所を調べるのにも役立ったりだとか、するんじゃないでしょうか。というかそのために作られたものだったような気がする。


結局2つの関数しか試してないw
でもこの2つだけでもそれなりの効果は発揮できそうかも。