2 module.exports = function(NEXT_FILTER) {
3 var util = require("./util.js");
4 var errors = require("./errors.js");
5 var tryCatch = util.tryCatch;
6 var errorObj = util.errorObj;
7 var keys = require("./es5.js").keys;
8 var TypeError = errors.TypeError;
10 function CatchFilter(instances, callback, promise) {
11 this._instances = instances;
12 this._callback = callback;
13 this._promise = promise;
16 function safePredicate(predicate, e) {
18 var retfilter = tryCatch(predicate).call(safeObject, e);
20 if (retfilter === errorObj) return retfilter;
22 var safeKeys = keys(safeObject);
23 if (safeKeys.length) {
24 errorObj.e = new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a See http://goo.gl/o84o68\u000a");
30 CatchFilter.prototype.doFilter = function (e) {
31 var cb = this._callback;
32 var promise = this._promise;
33 var boundTo = promise._boundValue();
34 for (var i = 0, len = this._instances.length; i < len; ++i) {
35 var item = this._instances[i];
36 var itemIsErrorType = item === Error ||
37 (item != null && item.prototype instanceof Error);
39 if (itemIsErrorType && e instanceof item) {
40 var ret = tryCatch(cb).call(boundTo, e);
41 if (ret === errorObj) {
42 NEXT_FILTER.e = ret.e;
46 } else if (typeof item === "function" && !itemIsErrorType) {
47 var shouldHandle = safePredicate(item, e);
48 if (shouldHandle === errorObj) {
51 } else if (shouldHandle) {
52 var ret = tryCatch(cb).call(boundTo, e);
53 if (ret === errorObj) {
54 NEXT_FILTER.e = ret.e;