情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでプロミスの全てのエラーを捕捉する

プロミスの全てのエラーを捕捉する機能は下のプロミスクラスで提供されています。

  • promiseクラス
  • rsvp.Promiseクラス
  • bluebirdクラス

promiseクラス

promiseクラスでプロミスの全てのエラーを捕捉するにはrequire('promise/lib/rejection-tracking').enable関数を使用します。

require('promise/lib/rejection-tracking').enable({
    allRejections: true, 
    onUnhandled: function (id, err) {
    }
});

第1引数にオプションをオブジェクトとして指定します。

allRejectionsオプションにtrueを指定し、onUnhandledオプションに捕捉したエラーに対する処理を関数として指定します。この関数の第1引数は識別子であり、第2引数はエラーオブジェクトです。

ただし、エラーが発生してからこの関数が呼び出されるまで2秒掛かりますので注意してください。

rsvp.Promiseクラス

rsvp.Promiseクラスでプロミスの全てのエラーを捕捉するにはrsvperrorイベントにイベントハンドラを登録します。

var rsvp = require('rsvp');

rsvp.on('error', function (err) {
});

このイベントのイベントハンドラの第1引数はエラーオブジェクトです。

bluebirdクラス

bluebirdクラスでプロミスの全てのエラーを捕捉するにはprocessunhandledRejectionイベントとrejectionHandledイベントにイベントハンドラを登録します。

process.on('unhandledRejection', function (err, p) {
});
process.on('rejectionHandled', function (p) {
});

unhandledRejectionイベントのイベントハンドラの第1引数はエラーオブジェクトであり、第2引数はプロミスです。

rejectionHandledイベントのイベントハンドラの第1引数はプロミスです。

サンプルコード1

promiseクラスの場合です。

promise-error.js

var promise = require('promise');

require('promise/lib/rejection-tracking').enable({
    allRejections: true, 
    onUnhandled: function (id, err) {
        console.error(err);
    }
});

var p1 = new promise(function (resolve, reject) {
    resolve('p1');
});
var p2 = new promise(function (resolve, reject) {
    reject(new Error('p2'));
});
var p3 = new promise(function (resolve, reject) {
    throw new Error('p3');
});

使用パッケージ

  • promise
    npm install promiseでインストールします。

実行結果

C:\work\node>node promise-error.js
Error: p2
    at C:\work\node\promise-error.js:14:9
    at tryCallTwo (C:\work\node\node_modules\promise\lib\core.js:45:5)
    at doResolve (C:\work\node\node_modules\promise\lib\core.js:200:13)
    at new Promise (C:\work\node\node_modules\promise\lib\core.js:66:3)
    at Object.<anonymous> (C:\work\node\promise-error.js:13:10)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
Error: p3
    at C:\work\node\promise-error.js:17:8
    at tryCallTwo (C:\work\node\node_modules\promise\lib\core.js:45:5)
    at doResolve (C:\work\node\node_modules\promise\lib\core.js:200:13)
    at new Promise (C:\work\node\node_modules\promise\lib\core.js:66:3)
    at Object.<anonymous> (C:\work\node\promise-error.js:16:10)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)

サンプルコード2

rsvp.Promiseクラスの場合です。

rsvp-error.js

var rsvp = require('rsvp');

rsvp.on('error', function(err) {
    console.error(err);
});

var p1 = new rsvp.Promise(function (resolve, reject) {
    resolve('p1');
});
var p2 = new rsvp.Promise(function (resolve, reject) {
    reject(new Error('p2'));
});
var p3 = new rsvp.Promise(function (resolve, reject) {
    throw new Error('p3');
});

使用パッケージ

  • RSVP.js
    npm install rsvpでインストールします。

実行結果

C:\work\node>node rsvp-error.js
Error: p2
    at C:\work\node\rsvp-error.js:11:9
    at lib$rsvp$$internal$$initializePromise (C:\work\node\node_modules\rsvp\dist\rsvp.js:1084:9)
    at new lib$rsvp$promise$$Promise (C:\work\node\node_modules\rsvp\dist\rsvp.js:546:53)
    at Object.<anonymous> (C:\work\node\rsvp-error.js:10:10)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
Error: p3
    at C:\work\node\rsvp-error.js:14:8
    at lib$rsvp$$internal$$initializePromise (C:\work\node\node_modules\rsvp\dist\rsvp.js:1084:9)
    at new lib$rsvp$promise$$Promise (C:\work\node\node_modules\rsvp\dist\rsvp.js:546:53)
    at Object.<anonymous> (C:\work\node\rsvp-error.js:13:10)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)

サンプルコード3

bluebirdクラスの場合です。

下のコードではプロミスのエラーオブジェクトを取得するためにp.reason関数を使用しています。

p.reason関数に関しては下の記事を参照してください。

bluebird-error.js

var bluebird = require('bluebird');

process.on('unhandledRejection', function(err, p) {
    console.error(err);
});
process.on('rejectionHandled', function(p) {
    console.error(p.reason());
});

var p1 = new bluebird(function (resolve, reject) {
    resolve('p1');
});
var p2 = new bluebird(function (resolve, reject) {
    reject(new Error('p2'));
});
var p3 = new bluebird(function (resolve, reject) {
    throw new Error('p3');
});

使用パッケージ

  • Bluebird
    npm install bluebirdでインストールします。

実行結果

C:\work\node>node bluebird-error.js
Error: p2
    at C:\work\node\bluebird-error.js:11:9
    at Promise._execute (C:\work\node\node_modules\bluebird\js\release\debuggability.js:272:9)
    at Promise._resolveFromExecutor (C:\work\node\node_modules\bluebird\js\release\promise.js:475:18)
    at new Promise (C:\work\node\node_modules\bluebird\js\release\promise.js:77:14)
    at Object.<anonymous> (C:\work\node\bluebird-error.js:10:10)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3
Error: p3
    at C:\work\node\bluebird-error.js:14:8
    at Promise._execute (C:\work\node\node_modules\bluebird\js\release\debuggability.js:272:9)
    at Promise._resolveFromExecutor (C:\work\node\node_modules\bluebird\js\release\promise.js:475:18)
    at new Promise (C:\work\node\node_modules\bluebird\js\release\promise.js:77:14)
    at Object.<anonymous> (C:\work\node\bluebird-error.js:13:10)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js