Syntax
class MyError extends Error {
constructor(message) {
super(message);
this.name = "MyError";
}
}Examples
Defining a Custom Error
Extending Error to create a specific, identifiable error type.
class ValidationError extends Error {
constructor(message, field) {
super(message); // sets this.message
this.name = "ValidationError";
this.field = field; // custom extra property
}
}
function validateAge(age) {
if (age < 0) {
throw new ValidationError("Age cannot be negative", "age");
}
return age;
}Catching and Distinguishing Error Types
Using instanceof to handle different error types differently.
try {
validateAge(-5);
} catch (error) {
if (error instanceof ValidationError) {
console.log(`Validation failed on field "${error.field}": ${error.message}`);
} else {
console.log("Unexpected error:", error.message);
}
}Best practices
- Always call super(message) first in a custom error's constructor before setting additional properties
- Set this.name to match the class name, so console output and logging clearly identify the specific error type
- Use instanceof checks in catch blocks to handle different, known error types differently, rather than parsing error.message strings
- Attach relevant context (like a field name or status code) as extra properties on the custom error, rather than cramming everything into the message string
Runtime & versions
Browsers and JavaScript runtimes. Feature availability depends on the language and runtime version used by your project; consult the official reference below.
ECMAScript specification