--- title: throw slug: Web/JavaScript/Reference/Statements/throw tags: - JavaScript - throw - виняток translation_of: Web/JavaScript/Reference/Statements/throw ---
Оператор throw
викидає визначений користувачем виняток. Виконання поточної функції буде зупинено (оператори після throw
не будуть виконані), а контроль буде передано до першого блоку catch
у стеку викликів. Якщо жодного блоку catch
не існує, виконання програми переривається.
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; } }
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ES3')}} | {{Spec2('ES3')}} | Початкове визначення. Реалізоване у JavaScript 1.4 |
{{SpecName('ES5.1', '#sec-12.13', 'throw statement')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-throw-statement', 'throw statement')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-throw-statement', 'throw statement')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.statements.throw")}}