err-object
Custom error object.
- supports to define error codes and messages in advance before use.
- provides cleaned error stack and we can manage the stack sanitizer by using
error-stack
(since 5.1.0)
Why
Tired writing code like this:
const error = new SomeError('message')
error.code = 'SOME_ERROR'
There are tremendous modules about custom errors in the NPM, but NONE of those is usable.
Install
$ npm i err-object
Usage
import {error} from 'err-object'
const message = 'message'
error(message)
error({
message,
name: 'ImplementError',
code: 'ERR_IMPL'
})
error(message, TypeError)
Creates error templates to manage multiple error types
We could use this to standardize the error objects of the whole project.
import {
Errors,
error as _error
} from 'err-object'
import util from 'util'
const {E, error, i18n} = new Errors()
E('ERR_NO_PERMISSION', 'you do not have permission to do this')
E('ERR_INVALID_TYPE', 'number expected but got %s', TypeError)
E('ERR_INVALID_TYPE', {
ctor: TypeError,
message: 'number expected but got %s'
})
const factory = ({code, preset, args, _}) => {
const {
ctor = Error,
message: messageTemplate,
...others
} = preset
const message = util.format(_(messageTemplate), ...args)
return _error({
...others,
code,
message,
args
}, Error)
}
E('ERR_INVALID_TYPE_2', {
ctor: TypeError,
message: 'number expected but got %s'
}, factory)
error('ERR_NO_PERMISSION')
error('ERR_INVALID_TYPE', 'string')
error('ERR_INVALID_TYPE_2', 'string')
new Errors({
factory
})
const ZH_CN_MAP = {
'number expected but got %s': '期望 number 类型但实际为 %s'
}
i18n(message => ZH_CN_MAP[message] || message)
error('ERR_INVALID_TYPE', 'string')
error(thing, ctor)
- thing
String|Object
- ctor
Class=Error
new Errors(options)
- options?
Object
- factory?
Function(code, preset, ...args)
the default error factory (the default value please see above) - notDefined?
Function(code, ...args)=exitOnNotDefined
will create the error object if the given code
is not defined by error.E
. Since 5.0.0
, if the given error code is not defined by error.E
, it will throw an error and exit the current process. prefix? string
Deprecated in 4.4.0
- messagePrefix?
string
the message prefix for every error message. New in 4.4.0
- codePrefix?
string
the code prefix. New in 4.4.0
- filterStackSources?
Array<path>=[]
defines source paths to be filtered out from error stacks. New in 5.1.0
error.E(code, preset, factory)
error.E(code, template, ctor)
Define an error preset.
- code
string
define the error code - preset
?Object
- ctor
?Error=Error
the constructor of the error - template
?(string | Function(...args))
the message template which will be formatted by util.format()
- other property/properties that you want to add to the error object.
- factory
?Function({code, preset, args, _})
the error factory
- _
?Function=(x=>x)
the i18nConverter
function which defaults to the function that just returns the argument.
Returns this
error.TE(code, template)
new in 4.5.0
Define a TypeError, in favor of using new TypeError('should be ..., but got
something')
const {error, TE} = new Errors()
TE('INVALID_OPTIONS', 'options must be an object')
throw error('INVALID_OPTIONS', undefined)
error.i18n(i18nConverter)
- i18nConverter
Function(string): string
Specify the i18n mapping function which receives the message template and returns the converted message template.
Returns this
error.error(code, ...args)
Creates a standard error object by code.
- code
- args
Array<any>
which will be passed and spreaded into factory
after the code
and the preset
parameters.
Returns Error
And if a given code
is not defined by error.E()
, the return value will be notDefined(code, ...args)
message prefix
const {E, error} = new Errors({
messagePrefix: '[err-object] ',
codePrefix: 'CORE_'
})
E('FATAL_ERROR', 'this is a fatal error')
const err = error('FATAL_ERROR')
console.log(err.message)
options.filterStackSources
/path/to/a.js (before):
const {error, E} = new Error()
E('FOO', 'bar')
module.exports = code => error(code)
/path/to/b.js
const error = require('./a')
const err = error('FOO')
console.log(err.stack)
Let's take a look at the error stack above, the /path/to/a.js
line is actually useless.
Then how to get rid of the first stack trace line? We can use options.filterStackSources
/path/to/a.js (after):
const {error, E} = new Error({
filterStackSources: [
__filename
]
})
E('FOO', 'bar')
module.exports = code => error(code)
Then,
console.log(err.stack)
License
MIT