Codectionary / Developer documentation / JavaScript

Custom Error Classes

You can create your own error types by extending the built-in Error class, giving you custom error names and additional properties while still working correctly with try/catch, instanceof checks, and stack traces. This makes error handling more precise than checking error.message strings.

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

At a glance

Purpose
Application logic and interaction
File extension
.js ยท .mjs
Runs in
Browsers and JavaScript runtimes
Usually used with
HTML, CSS and Web APIs

Specifications & further reading

Related JavaScript documentation