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);
}
Спецификации
Совместимость с браузерами
| 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 |
См. также
© 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