You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.3 KiB
51 lines
1.3 KiB
3 years ago
|
var inherits = require('util').inherits;
|
||
|
|
||
|
var NestedError = function (message, nested) {
|
||
|
this.nested = nested;
|
||
|
|
||
|
if (message instanceof Error) {
|
||
|
nested = message;
|
||
|
} else if (typeof message !== 'undefined') {
|
||
|
Object.defineProperty(this, 'message', {
|
||
|
value: message,
|
||
|
writable: true,
|
||
|
enumerable: false,
|
||
|
configurable: true
|
||
|
});
|
||
|
}
|
||
|
|
||
|
Error.captureStackTrace(this, this.constructor);
|
||
|
var oldStackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack');
|
||
|
var stackDescriptor = buildStackDescriptor(oldStackDescriptor, nested);
|
||
|
Object.defineProperty(this, 'stack', stackDescriptor);
|
||
|
};
|
||
|
|
||
|
function buildStackDescriptor(oldStackDescriptor, nested) {
|
||
|
if (oldStackDescriptor.get) {
|
||
|
return {
|
||
|
get: function () {
|
||
|
var stack = oldStackDescriptor.get.call(this);
|
||
|
return buildCombinedStacks(stack, this.nested);
|
||
|
}
|
||
|
};
|
||
|
} else {
|
||
|
var stack = oldStackDescriptor.value;
|
||
|
return {
|
||
|
value: buildCombinedStacks(stack, nested)
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function buildCombinedStacks(stack, nested) {
|
||
|
if (nested) {
|
||
|
stack += '\nCaused By: ' + nested.stack;
|
||
|
}
|
||
|
return stack;
|
||
|
}
|
||
|
|
||
|
inherits(NestedError, Error);
|
||
|
NestedError.prototype.name = 'NestedError';
|
||
|
|
||
|
|
||
|
module.exports = NestedError;
|