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種類の例外を同じ方法で処理できるのは、結構便利かなーと思います。