Перейти к основному содержимому

5.01. Встроенные типы ошибок

Разработчику Архитектору

Встроенные типы ошибок

Стандарт ECMAScript определяет встроенные типы ошибок, но пользовательские ошибки могут быть любыми значениями (в том числе строками или объектами). Однако для согласованности и совместимости рекомендуется использовать только экземпляры Error или его подклассов.


Встроенные типы ошибок в JavaScript (ECMAScript 2025)

Все они являются конструкторами и наследуются от глобального класса Error.

Основные встроенные типы ошибок:

  • Error — базовый класс для всех ошибок.
  • EvalError — ошибка, связанная с функцией eval() (в современном коде почти не используется).
  • RangeError — возникает при передаче значения вне допустимого диапазона (например, new Array(-1)).
  • ReferenceError — возникает при обращении к несуществующей переменной в текущей области видимости.
  • SyntaxError — возникает при разборе синтаксически некорректного кода (например, в JSON.parse или eval).
  • TypeError — возникает при операции с несовместимым типом (например, вызов нефункции: "hello"()).
  • URIError — возникает при использовании функций encodeURI, decodeURI, encodeURIComponent, decodeURIComponent с недопустимыми аргументами.

Дополнительные ошибки в средах выполнения:

Эти ошибки не определены в спецификации ECMAScript, но широко поддерживаются в браузерах и Node.js:

  • AggregateError — используется для представления нескольких ошибок одновременно (например, в Promise.any()).
  • DOMException — ошибка, генерируемая API DOM (в браузерах). Не является подклассом Error, но содержит поля name и message.
  • WebAssembly.CompileError, WebAssembly.LinkError, WebAssembly.RuntimeError — специфичные ошибки WebAssembly.

Иерархия (упрощённо):

Error
├── EvalError
├── RangeError
├── ReferenceError
├── SyntaxError
├── TypeError
├── URIError
└── AggregateError

DOMException и ошибки WebAssembly не наследуются от Error в строгом смысле, но используются аналогично.


Примечания:

  • В отличие от Python, JavaScript не имеет встроенных исключений вроде IndexError или KeyError. Ошибки при работе с массивами или объектами обычно проявляются как TypeError (например, при попытке вызвать метод у undefined) или молча возвращают undefined.
  • Проверка типа ошибки выполняется через свойство .name или оператор instanceof:
    try {
    // ...
    } catch (e) {
    if (e instanceof TypeError) { /* ... */ }
    }
  • В Node.js также могут возникать системные ошибки (SystemError), но они представлены как объекты с полями code (например, 'ENOENT') и не являются отдельными классами.

Как получить список программно (в среде, поддерживающей globalThis):

const errorTypes = [
'Error',
'EvalError',
'RangeError',
'ReferenceError',
'SyntaxError',
'TypeError',
'URIError',
'AggregateError'
].filter(name => typeof globalThis[name] === 'function');

console.log(errorTypes);

Этот подход корректно работает в современных браузерах и Node.js 15+.