Create custom error types.
Features
-
Simple API:
errorType('errorName')
- Follows best practices
- Error properties can be set on initialization:
new CustomError('message', { props: { example: true } })
- Polyfills
error.cause
on older Node.js and browsers - Optional custom initialization logic
Examples
Custom error types
import errorType from 'error-type'
const UserError = errorType('UserError')
const DatabaseError = errorType('DatabaseError')
try {
throw new UserError('message')
} catch (error) {
console.log(error.name) // 'UserError'
console.log(error instanceof UserError) // true
}
Error properties
const userError = new UserError('message', { props: { userId: 56 } })
console.log(userError.userId) // 56
Error cause
// `error.cause` can be used even in older Node.js or browsers
try {
doSomething()
} catch (cause) {
throw new UserError('message', { cause })
}
Custom initialization logic
const DatabaseError = errorType('DatabaseError', (error, { props }) => {
error.dbId = props.databaseId
})
const databaseError = new DatabaseError('message', { props: { databaseId: 2 } })
console.log(databaseError.dbId) // 2
console.log(databaseError.databaseId) // undefined
Install
npm install error-type
This package is an ES module and must be loaded using
an import
or import()
statement,
not require()
.
API
errorType(errorName, onCreate?)
errorName
string
onCreate
(error, params) => void
Return value: CustomError
Custom initialization logic
onCreate(error, params)
is optional and is called on
new CustomError('message', params)
.
By default, it sets any params.props
as error
properties. However, you can
override it with any custom logic to validate, normalize params
, etc.
Best practices
Constructor
A common pattern for custom error types is:
class CustomError extends Error {
constructor(message) {
super(message)
this.name = 'CustomError'
}
}
However, this has several issues (which error-type
handles):
-
error.cause
is not set - Unlike native error types,
error.name
is:- Enumerable, although it should not. For example,
for (const key in error)
will iterate overname
, which is unexpected. - Set on the error instance instead of its prototype. In Node.js, this
sometimes results in the error name being printed as
Error [CustomError]
instead ofCustomError
.
- Enumerable, although it should not. For example,
Polyfills
Some Error
polyfills (such as
es-shims/error-cause
) prevent
extending from it. This library includes
some logic
to fix this.
Related projects
-
modern-errors
: Handle errors like it's 2022 🔮 -
create-error-types
: Create multiple error types -
error-serializer
: Convert errors to/from plain objects -
normalize-exception
: Normalize exceptions/errors -
merge-error-cause
: Merge an error with itscause
-
error-cause-polyfill
: Polyfillerror.cause
-
handle-cli-error
: 💣 Error handler for CLI applications 💥 -
log-process-errors
: Show some ❤ to Node.js process errors
Support
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.
Contributing
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!