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

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

Разработчику Архитектору
Сначала — теория и синтаксис

Определения "ошибка vs исключение" и раскрутка стека — 4.06 / 111.
Практика try/catch, async/await, unhandledrejectionОбработка исключений в JavaScript.


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

Стандарт 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 (try / except); в JavaScript синтаксис свой, но стек вызовов и раскрутка те же. Подробнее: ошибки и исключения.

Play ITЗагрузка интерактивного демо…


Примечания

  • В отличие от 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+.