Spec-Zone.ru › JavaScript

throw

Baseline Широко доступно

Эта функция является устоявшейся и работает на множестве устройств и версий браузеров. Она доступна во всех браузерах с июля 2015 года.

Оператор throw генерирует пользовательское исключение. Выполнение текущей функции будет остановлено (операторы после throw не будут выполнены), и управление будет передано первому блоку catch в стеке вызовов. Если среди вызывающих функций нет блока catch, программа завершит работу.

Попробуйте

function getRectArea(width, height) {
  if (isNaN(width) || isNaN(height)) {
    throw new Error("Parameter is not a number!");
  }
}

try {
  getRectArea(3, "A");
} catch (e) {
  console.error(e);
  // Expected output: Error: Parameter is not a number!
}

Синтаксис

throw expression;
expression
Выражение для выбрасывания.

Описание

Оператор throw является допустимым во всех контекстах, где могут использоваться операторы. Его выполнение генерирует исключение, которое проходит через стек вызовов. Для получения дополнительной информации о перехвате и обработке ошибок см. Control flow and error handling.

За ключевым словом throw может следовать любое выражение, например:

throw error; // Throws a previously defined value (e.g. within a catch block)
throw new Error("Required"); // Throws a new Error object

На практике исключение, которое вы выбрасываете, должно всегда быть объектом Error или экземпляром подкласса Error, такого как RangeError. Это связано с тем, что код, который перехватывает ошибку, может ожидать наличия определенных свойств, таких как message, в перехваченном значении. Например, веб-API обычно выбрасывают экземпляры DOMException, которые наследуются от Error.prototype.

Автоматическая вставка точки с запятой

Синтаксис запрещает символы новой строки между ключевым словом throw и выражением, которое нужно выбросить.

throw
new Error();

Код выше преобразуется автоматической вставкой точки с запятой (ASI) в:

throw;
new Error();

Это недопустимый код, потому что, в отличие от return, за throw должно следовать выражение.

Чтобы избежать этой проблемы (предотвратить ASI), вы можете использовать скобки:

throw (
  new Error()
);

Примеры

Выбрасывание пользовательской ошибки

Этот пример определяет функцию, которая выбрасывает TypeError, если входные данные не ожидаемого типа.

function isNumeric(x) {
  return ["number", "bigint"].includes(typeof x);
}

function sum(...values) {
  if (!values.every(isNumeric)) {
    throw new TypeError("Can only add numbers");
  }
  return values.reduce((a, b) => a + b);
}

console.log(sum(1, 2, 3)); // 6
try {
  sum("1", "2");
} catch (e) {
  console.error(e); // TypeError: Can only add numbers
}

Выбрасывание существующего объекта

Этот пример вызывает асинхронную функцию на основе обратного вызова и выбрасывает ошибку, если обратный вызов получает ошибку.

readFile("foo.txt", (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
});

Исключения, выбрасываемые таким образом, не могут быть перехвачены вызывающим кодом и приведут к сбою программы, если (a) сама функция readFile не перехватит исключение, или (b) программа не запущена в контексте, который перехватывает ошибки верхнего уровня. Вы можете обрабатывать ошибки более естественно, используя конструктор Promise().

function readFilePromise(path) {
  return new Promise((resolve, reject) => {
    readFile(path, (err, data) => {
      if (err) {
        reject(err);
      }
      resolve(data);
    });
  });
}

try {
  const data = await readFilePromise("foo.txt");
  console.log(data);
} catch (err) {
  console.error(err);
}

Спецификации

Specification
ECMAScript® 2027 Language Specification
# sec-throw-statement

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
throw
1
12
1
4
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • try...catch
  • Error

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API