Custom Error Classes
Create custom error classes by extending the built-in Error. This helps distinguish different error types in your app.
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
try {
throw new ValidationError("Invalid email format");
} catch (err) {
console.log(err.name);
console.log(err.message);
}
Try it Yourself →
Extending Error with Properties
Add extra properties to your custom error to carry additional context like status codes or field names.
class HttpError extends Error {
constructor(message, statusCode) {
super(message);
this.name = "HttpError";
this.statusCode = statusCode;
}
}
async function fetchUser(id) {
const res = await fetch("/api/users/" + id);
if (!res.ok) {
throw new HttpError("User not found", res.status);
}
return res.json();
}
fetchUser(999).catch(err => {
console.log(err.name, err.statusCode, err.message);
});
Try it Yourself →
Multiple Custom Error Types
Define several custom error classes to handle different failure modes precisely.
class NotFoundError extends Error {
constructor(resource) {
super(resource + " not found");
this.name = "NotFoundError";
}
}
class AuthError extends Error {
constructor() {
super("Authentication failed");
this.name = "AuthError";
}
}
try {
throw new NotFoundError("Product");
} catch (err) {
if (err instanceof NotFoundError) {
console.log("Handle 404:", err.message);
} else if (err instanceof AuthError) {
console.log("Handle 401:", err.message);
}
}
Try it Yourself →