| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | /* * verror.js: richer JavaScript errors */var mod_assert = require('assert');var mod_util = require('util');var mod_extsprintf = require('extsprintf');/* * Public interface */exports.VError = VError;exports.WError = WError;exports.MultiError = MultiError;/* * Like JavaScript's built-in Error class, but supports a "cause" argument and a * printf-style message.  The cause argument can be null. */function VError(options){	var args, causedBy, ctor, tailmsg;	if (options instanceof Error || typeof (options) === 'object') {		args = Array.prototype.slice.call(arguments, 1);	} else {		args = Array.prototype.slice.call(arguments, 0);		options = undefined;	}	tailmsg = args.length > 0 ?	    mod_extsprintf.sprintf.apply(null, args) : '';	this.jse_shortmsg = tailmsg;	this.jse_summary = tailmsg;	if (options) {		causedBy = options.cause;		if (!causedBy || !(options.cause instanceof Error))			causedBy = options;		if (causedBy && (causedBy instanceof Error)) {			this.jse_cause = causedBy;			this.jse_summary += ': ' + causedBy.message;		}	}	this.message = this.jse_summary;	Error.call(this, this.jse_summary);	if (Error.captureStackTrace) {		ctor = options ? options.constructorOpt : undefined;		ctor = ctor || arguments.callee;		Error.captureStackTrace(this, ctor);	}}mod_util.inherits(VError, Error);VError.prototype.name = 'VError';VError.prototype.toString = function ve_toString(){	var str = (this.hasOwnProperty('name') && this.name ||		this.constructor.name || this.constructor.prototype.name);	if (this.message)		str += ': ' + this.message;	return (str);};VError.prototype.cause = function ve_cause(){	return (this.jse_cause);};/* * Represents a collection of errors for the purpose of consumers that generally * only deal with one error.  Callers can extract the individual errors * contained in this object, but may also just treat it as a normal single * error, in which case a summary message will be printed. */function MultiError(errors){	mod_assert.ok(errors.length > 0);	this.ase_errors = errors;	VError.call(this, errors[0], 'first of %d error%s',	    errors.length, errors.length == 1 ? '' : 's');}mod_util.inherits(MultiError, VError);/* * Like JavaScript's built-in Error class, but supports a "cause" argument which * is wrapped, not "folded in" as with VError.	Accepts a printf-style message. * The cause argument can be null. */function WError(options){	Error.call(this);	var args, cause, ctor;	if (typeof (options) === 'object') {		args = Array.prototype.slice.call(arguments, 1);	} else {		args = Array.prototype.slice.call(arguments, 0);		options = undefined;	}	if (args.length > 0) {		this.message = mod_extsprintf.sprintf.apply(null, args);	} else {		this.message = '';	}	if (options) {		if (options instanceof Error) {			cause = options;		} else {			cause = options.cause;			ctor = options.constructorOpt;		}	}	Error.captureStackTrace(this, ctor || this.constructor);	if (cause)		this.cause(cause);}mod_util.inherits(WError, Error);WError.prototype.name = 'WError';WError.prototype.toString = function we_toString(){	var str = (this.hasOwnProperty('name') && this.name ||		this.constructor.name || this.constructor.prototype.name);	if (this.message)		str += ': ' + this.message;	if (this.we_cause && this.we_cause.message)		str += '; caused by ' + this.we_cause.toString();	return (str);};WError.prototype.cause = function we_cause(c){	if (c instanceof Error)		this.we_cause = c;	return (this.we_cause);};
 |