Skip to content
← Back to rules

unicorn/custom-error-definition Style

🚧 An auto-fix is planned for this rule, but not implemented at this time.

What it does ​

Enforces the only valid way of Error subclassing. It works with any super class that ends in Error.

Why is this bad? ​

Incorrectly defined custom errors can lead to unexpected behavior when catching and identifying errors. Missing super() calls, wrong name property values, or non-standard class names make error handling unreliable.

Examples ​

Examples of incorrect code for this rule:

js
class CustomError extends Error {
  constructor(message) {
    super(message);
    // The `this.message` assignment is useless as it's already set via the `super()` call.
    this.message = message;
    this.name = "CustomError";
  }
}

class CustomError extends Error {
  constructor(message) {
    super();
    // Pass the error message to `super()` instead of setting `this.message`.
    this.message = message;
    this.name = "CustomError";
  }
}

class CustomError extends Error {
  constructor(message) {
    super(message);
    // No `name` property set. The name property is needed so the
    // error shows up as `[CustomError: foo]` and not `[Error: foo]`.
  }
}

class CustomError extends Error {
  constructor(message) {
    super(message);
    // Use a string literal to set the `name` property as it will not change after minifying.
    this.name = this.constructor.name;
  }
}

class CustomError extends Error {
  constructor(message) {
    super(message);
    // The `name` property should be set to the class name.
    this.name = "MyError";
  }
}

Examples of correct code for this rule:

js
class CustomError extends Error {
  constructor(message) {
    super(message);
    this.name = "CustomError";
  }
}

class CustomError extends Error {
  constructor() {
    super("My custom error");
    this.name = "CustomError";
  }
}

class CustomError extends TypeError {
  constructor() {
    super();
    this.name = "CustomError";
  }
}

class CustomError extends Error {
  name = "CustomError";
}

How to use ​

To enable this rule using the config file or in the CLI, you can use:

json
{
  "rules": {
    "unicorn/custom-error-definition": "error"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  rules: {
    "unicorn/custom-error-definition": "error",
  },
});
bash
oxlint --deny unicorn/custom-error-definition

Version ​

This rule was added in v1.57.0.

References ​