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.
57 lines
1.6 KiB
57 lines
1.6 KiB
var prr = require('prr') |
|
|
|
function init (type, message, cause) { |
|
if (!!message && typeof message != 'string') { |
|
message = message.message || message.name |
|
} |
|
prr(this, { |
|
type : type |
|
, name : type |
|
// can be passed just a 'cause' |
|
, cause : typeof message != 'string' ? message : cause |
|
, message : message |
|
}, 'ewr') |
|
} |
|
|
|
// generic prototype, not intended to be actually used - helpful for `instanceof` |
|
function CustomError (message, cause) { |
|
Error.call(this) |
|
if (Error.captureStackTrace) |
|
Error.captureStackTrace(this, this.constructor) |
|
init.call(this, 'CustomError', message, cause) |
|
} |
|
|
|
CustomError.prototype = new Error() |
|
|
|
function createError (errno, type, proto) { |
|
var err = function (message, cause) { |
|
init.call(this, type, message, cause) |
|
//TODO: the specificity here is stupid, errno should be available everywhere |
|
if (type == 'FilesystemError') { |
|
this.code = this.cause.code |
|
this.path = this.cause.path |
|
this.errno = this.cause.errno |
|
this.message = |
|
(errno.errno[this.cause.errno] |
|
? errno.errno[this.cause.errno].description |
|
: this.cause.message) |
|
+ (this.cause.path ? ' [' + this.cause.path + ']' : '') |
|
} |
|
Error.call(this) |
|
if (Error.captureStackTrace) |
|
Error.captureStackTrace(this, err) |
|
} |
|
err.prototype = !!proto ? new proto() : new CustomError() |
|
return err |
|
} |
|
|
|
module.exports = function (errno) { |
|
var ce = function (type, proto) { |
|
return createError(errno, type, proto) |
|
} |
|
return { |
|
CustomError : CustomError |
|
, FilesystemError : ce('FilesystemError') |
|
, createError : ce |
|
} |
|
}
|
|
|