Properly create error classes
npm install error-class-utils






Properly create error classes.
Useful utilities when creating custom error classes.
- Ponyfill
error.cause
on
older Node.js and browsers
- Properly set error.name
- Fix issues when Error has been
polyfilled
``js
import {
ensureCorrectClass,
ponyfillCause,
setErrorName,
} from 'error-class-utils'
export class CustomError extends Error {
constructor(message, parameters) {
super(message, parameters)
// Fix some issues when Error has been polyfilled
ensureCorrectClass(this, new.target)
// Ponyfill error.cause on old Node.js/browsers
ponyfillCause(this, parameters)
}
}
// Properly set error.name as a non-enumerable and inherited property`
setErrorName(CustomError, 'CustomError')
`js
import { CustomError } from './errors.js'
const cause = new Error('innerMessage')
const error = new CustomError('message', { cause })
console.log(error instanceof CustomError) // true
console.log(error.name) // 'CustomError'
console.log(error.cause) // Error: innerMessage ...
`
`bash`
npm install error-class-utils
This package works in both Node.js >=18.18.0 and
browsers.
This is an ES module. It must be loaded using
an import or import() statement,
not require(). If TypeScript is used, it must be configured to
output ES modules,
not CommonJS.
error Error\new.target typeof Error\void
_Return value_:
Some Error polyfills (such ases-shims/error-cause) prevent
extending from it. This fixes it.
The second argument must be
new.target.
This must be called directly inside a class constructor, after
super(message, parameters).
`js
import { ensureCorrectClass } from 'error-class-utils'
class CustomError extends Error {
constructor(message, parameters) {
super(message, parameters)
ensureCorrectClass(this, new.target)
}
}
// Thanks to ensureCorrectClass(), this is now always true even whenError
// has been polyfilled`
console.log(new CustomError('message') instanceof CustomError) // true
error Error\parameters ErrorParams?\void
_Return value_:
Ponyfills
error.cause
on
older Node.js and browsers.
This must be called inside a class constructor, after
super(message, parameters).
`js
import { ponyfillCause } from 'error-class-utils'
class CustomError extends Error {
constructor(message, parameters) {
super(message, parameters)
ponyfillCause(this, parameters)
}
}
try {
throw new Error('innerMessage')
} catch (cause) {
// Works on any platforms thanks to ponyfill
const error = new CustomError('message', { cause })
console.log(error.cause.message) // 'innerMessage'
}
`
ErrorClass typeof Error\name string\void
_Return value_:
This must be performed on an error class, not instance. Unlike setting
this.name = '...' inside an error's constructor, this follows the nativeError classes' pattern where error.name:
- Ends with the Error suffixname
- Matches the
constructor's
- Is
inherited
- Is
non-enumerable
`js
import { setErrorName } from 'error-class-utils'
class CustomError extends Error {}
setErrorName(CustomError, 'CustomError')
console.log(CustomError.name) // 'CustomError'
console.log(CustomError.prototype.name) // 'CustomError'
const error = new CustomError('message')
console.log(error.name) // 'CustomError'
console.log(Object.keys(error).includes('name')) // false
`
- modern-errors: Handle errors in
a simple, stable, consistent way
- error-custom-class: Create
one error class
- error-serializer: Convert
errors to/from plain objects
- normalize-exception:
Normalize exceptions/errors
- is-error-instance: Check if
a value is an Error instancemerge-error-cause
- : Merge ancause
error with its set-error-class
- : Properlyset-error-message
update an error's class
- : Properlywrap-error-message
update an error's message
- :set-error-props
Properly wrap an error's message
- : Properlyset-error-stack
update an error's properties
- : Properlyerror-cause-polyfill
update an error's stack
- :error.cause
Polyfill handle-cli-error
- : 💣 Errorlog-process-errors
handler for CLI applications 💥
- : Showerror-http-response
some ❤ to Node.js process errors
- :winston-error-format
Create HTTP error responses
- : Log
errors with Winston
For any question, _don't hesitate_ to submit an issue on GitHub.
Everyone is welcome regardless of personal background. We enforce a
Code of conduct in order to promote a positive and
inclusive environment.
This project was made with ❤️. The simplest way to give back is by starring and
sharing it online.
If the documentation is unclear or has a typo, please click on the page's Edit`
button (pencil icon) and suggest a correction.
If you would like to help us fix a bug or add a new feature, please check our
guidelines. Pull requests are welcome!