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

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

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

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

Стандарт 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+.