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つだけでもそれなりの効果は発揮できそうかも。