node.jsで使える非同期コントロールフローライブラリ nue その8 - 例外ハンドリング
nueでは、例外(エラー)はflowの最後の関数でハンドリングできます。例外が起きた場合、処理は最後の関数に移り、this.errに例外を表すオブジェクトが設定されます。
非同期ワークフローにおける例外には2種類あります。1つめは、フローの中で明示的にthrowされる例外。2つめは、fs.readFileなどのコールバックの第一引数に渡される例外です。nueはどちらの例外であっても同じようにハンドリングできます。
明示的にthrowされる例外のハンドリング
var flow = require('nue').flow; flow( function () { this.next(); }, function () { throw new Error('エラー'); // 例外はflowの中の最後の関数でハンドルできる }, function () { if (this.err) throw this.err; // this.errは上でスローされた例外オブジェクト console.log('done'); this.next(); } )();
fs.readFileなどのコールバックの第一引数に渡される例外のハンドリング
var flow = require('nue').flow; var fs = require('fs'); flow( function () { this.next(); }, function () { fs.readFile('存在しないファイル', 'utf8', this.async()); // 例外オブジェクトがコールバックに渡される }, function () { if (this.err) throw this.err; // this.errはfs.readFileのコールバックの第一引数に渡される例外オブジェクト console.log('done'); this.next(); } )();
flowはネストできるのですが、ネストしたflowの中で発生した例外は、ネストしたflowにおける最後の関数で処理されなければ、ネストしている上位のflowへ伝播します。したがって、次のようなハンドリングも可能です。
ネストしたflowで発生した例外を上位のflowでハンドリング
var flow = require('nue').flow; flow( function () { this.next(); }, flow( function () { throw new Error('エラー'); // ネストしたflowでの例外 } ), function () { if (this.err) throw this.err; // this.errはネストしたflowでスローされた例外オブジェクト console.log('done'); this.next(); } )();
2種類の例外を同じ方法で処理できるのは、結構便利かなーと思います。