Оператор throw
викидає визначений користувачем виняток. Виконання поточної функції буде зупинено (оператори після throw
не будуть виконані), а контроль буде передано до першого блоку catch
у стеку викликів. Якщо жодного блоку catch
не існує, виконання програми переривається.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
throw expression;
expression
- Вираз, що викидається.
Опис
Скористайтеся оператором throw
, щоб викинути виняток. Коли викидаєте виняток, expression
вказує значення винятка. Кожна з наступних команд викидає виняток:
throw 'Error2'; // генерує виняток, що має рядкове значення
throw 42; // генерує виняток, що має значення 42
throw true; // генерує виняток, що має значення true
throw new Error('Required'); // генерує об'єкт помилки з повідомленням Required
Також зазначте, що на оператор throw
впливає автоматична вставка крапки з комою (automatic semicolon insertion, ASI), оскільки між ключовим словом throw
та виразом не дозволяється вставляти символи закінчення рядка.
Приклади
Викидання об'єкта
Ви можете вказати об'єкт, коли викидаєте виняток. Після цього ви можете звертатися до властивостей об'єкта у блоці catch
. Наступний приклад створює об'єкт типу UserException
, і далі використовує його з оператором throw
.
function UserException(message) {
this.message = message;
this.name = 'UserException';
}
function getMonthName(mo) {
mo = mo - 1; // Припасувати номер місяця до індексу масиву (1 = Січ, 12 = Груд)
var months = ['Січ', 'Лют', 'Берез', 'Квіт', 'Трав', 'Черв', 'Лип',
'Серп', 'Верес', 'Жовт', 'Листоп', 'Груд'];
if (months[mo] !== undefined) {
return months[mo];
} else {
throw new UserException('InvalidMonthNo');
}
}
try {
// команди до виконання
var myMonth = 15; // 15 не входить у визначені межі й викликає виняток
var monthName = getMonthName(myMonth);
} catch (e) {
monthName = 'unknown';
console.error(e.message, e.name); // передати об'єкт винятку до обробника помилок
}
Ще один приклад викидання об'єкта
Наступний приклад перевіряє наданий текстовий рядок на формат поштового індексу. Якщо поштовий індекс використовує неправильний формат, оператор throw викидає виняток, створюючи об'єкт типу ZipCodeFormatException
.
/*
* Створює об'єкт ZipCode.
*
* Дозволені формати поштового індексу:
* 12345
* 12345-6789
* 123456789
* 12345 6789
*
* Якщо аргумент, переданий до конструктора ZipCode, не відповідає
* жодному з цих шаблонів, викидається виняток.
*/
function ZipCode(zip) {
zip = new String(zip);
pattern = /[0-9]{5}([- ]?[0-9]{4})?/;
if (pattern.test(zip)) {
// значення поштового індексу буде першим збігом у рядку
this.value = zip.match(pattern)[0];
this.valueOf = function() {
return this.value
};
this.toString = function() {
return String(this.value)
};
} else {
throw new ZipCodeFormatException(zip);
}
}
function ZipCodeFormatException(value) {
this.value = value;
this.message = 'не відповідає очікуваному формату поштового індексу';
this.toString = function() {
return this.value + this.message;
};
}
/*
* Це можна вставити у скрипт, який перевіряє дані адреси
* на відповідність формату адрес.
*/
const ZIPCODE_INVALID = -1;
const ZIPCODE_UNKNOWN_ERROR = -2;
function verifyZipCode(z) {
try {
z = new ZipCode(z);
} catch (e) {
if (e instanceof ZipCodeFormatException) {
return ZIPCODE_INVALID;
} else {
return ZIPCODE_UNKNOWN_ERROR;
}
}
return z;
}
a = verifyZipCode(95060); // повертає 95060
b = verifyZipCode(9560); // повертає -1
c = verifyZipCode('a'); // повертає -1
d = verifyZipCode('95060'); // повертає 95060
e = verifyZipCode('95060 1234'); // повертає 95060 1234
Повторне викидання винятку
Ви можете скористатись оператором throw
, щоб повторно викинути виняток після того, як перехопите його. Наступний приклад перехоплює виняток з числовим значенням та повторно викидає його, якщо значення більше за 50. Повторно викинутий виняток спливає наверх до замикаючої функції або на верхній рівень, так, що користувач його бачить.
try {
throw n; // викидає виняток з числовим значенням
} catch (e) {
if (e <= 50) {
// команди для обробки винятків 1-50
} else {
// неможливо обробити цей виняток, тому викидаємо його повторно
throw e;
}
}
Специфікації
Специфікація | Статус | Коментар |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | Standard | Початкове визначення. Реалізоване у JavaScript 1.4 |
ECMAScript 5.1 (ECMA-262) The definition of 'throw statement' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'throw statement' in that specification. |
Standard | |
ECMAScript (ECMA-262) The definition of 'throw statement' in that specification. |
Living Standard |
Сумісність з веб-переглядачами
BCD tables only load in the browser