import ExtendableError from 'extendable-error';class SomeError extends ExtendableError { constructor( message: string, public code: number ) { super(message); }}let someError = new SomeError('Some error', 0x0001);
Purpose of ExtendableError is to create custom error classes in JavaScript
with consistent behavior for error handling. ExtendableError preserves the error stack and name.
I asked ChatGPT to list the differences between extending ExtendableError and extending Error directly and below is picked from the ChatGPT answer:
name Property Mismatch (In Some Environments):
Direct Error Inheritance: In some older JavaScript environments (e.g., older versions of Node.js or some non-browser environments), if you extend Error directly, the name property might not always be correctly set to the name of the error class (e.g., ValidationError).
ExtendableError: It explicitly sets this.name = this.constructor.name;, which ensures that the name property is set correctly across all environments, even if the environment doesn’t behave correctly
with Error inheritance.
2. Stack Trace Reliability:
Direct Error Inheritance: In some environments, especially Node.js, using Error.captureStackTrace directly in your custom error class ensures the stack trace points to the custom error class. If you
don’t use this, the stack trace might not behave as expected and could potentially show the wrong location in the call stack.
ExtendableError: By using Error.captureStackTrace, ExtendableError ensures that the stack trace is correctly generated, pointing to the location where the error was thrown. This is critical in environments
like Node.js where debugging is more reliant on stack traces.
Hey, my name is Ramu Narasinga. I study large open-source projects and create content about their codebase architecture and best practices, sharing it through articles, videos.