diff options
Diffstat (limited to 'files/uk/web/javascript/reference/statements/throw/index.html')
-rw-r--r-- | files/uk/web/javascript/reference/statements/throw/index.html | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/files/uk/web/javascript/reference/statements/throw/index.html b/files/uk/web/javascript/reference/statements/throw/index.html new file mode 100644 index 0000000000..96b8974f40 --- /dev/null +++ b/files/uk/web/javascript/reference/statements/throw/index.html @@ -0,0 +1,198 @@ +--- +title: throw +slug: Web/JavaScript/Reference/Statements/throw +tags: + - JavaScript + - throw + - виняток +translation_of: Web/JavaScript/Reference/Statements/throw +--- +<div>{{jsSidebar("Statements")}}</div> + +<p><strong>Оператор</strong> <strong><code>throw</code> </strong>викидає визначений користувачем виняток. Виконання поточної функції буде зупинено (оператори після <code>throw</code> не будуть виконані), а контроль буде передано до першого блоку <a href="/uk/docs/Web/JavaScript/Reference/Statements/try...catch"><code>catch</code></a> у стеку викликів. Якщо жодного блоку <code>catch</code> не існує, виконання програми переривається.</p> + +<div>{{EmbedInteractiveExample("pages/js/statement-throw.html")}}</div> + + + +<h2 id="Синтаксис">Синтаксис</h2> + +<pre class="syntaxbox">throw <em>expression</em>; </pre> + +<dl> + <dt><code>expression</code></dt> + <dd>Вираз, що викидається.</dd> +</dl> + +<h2 id="Опис">Опис</h2> + +<p>Скористайтеся оператором <code>throw</code>, щоб викинути виняток. Коли викидаєте виняток, <code>expression</code> вказує значення винятка. Кожна з наступних команд викидає виняток:</p> + +<pre class="brush: js">throw 'Error2'; // генерує виняток, що має рядкове значення +throw 42; // генерує виняток, що має значення 42 +throw true; // генерує виняток, що має значення true +throw new Error('Required'); // генерує об'єкт помилки з повідомленням Required +</pre> + +<p>Також зазначте, що на оператор <code>throw</code> впливає <a href="/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Automatic_semicolon_insertion">автоматична вставка крапки з комою (automatic semicolon insertion, ASI)</a>, оскільки між ключовим словом <code>throw</code> та виразом не дозволяється вставляти символи закінчення рядка.</p> + +<h2 id="Приклади">Приклади</h2> + +<h3 id="Викидання_обєкта">Викидання об'єкта</h3> + +<p>Ви можете вказати об'єкт, коли викидаєте виняток. Після цього ви можете звертатися до властивостей об'єкта у блоці <code>catch</code>. Наступний приклад створює об'єкт типу <code>UserException</code>, і далі використовує його з оператором <code>throw</code>.</p> + +<pre class="brush: js">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); // передати об'єкт винятку до обробника помилок +} +</pre> + +<h3 id="Ще_один_приклад_викидання_обєкта">Ще один приклад викидання об'єкта</h3> + +<p>Наступний приклад перевіряє наданий текстовий рядок на формат поштового індексу. Якщо поштовий індекс використовує неправильний формат, оператор throw викидає виняток, створюючи об'єкт типу <code>ZipCodeFormatException</code>.</p> + +<pre class="brush: js">/* + * Створює об'єкт 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 +</pre> + +<h3 id="Повторне_викидання_винятку">Повторне викидання винятку</h3> + +<p>Ви можете скористатись оператором <code>throw</code>, щоб повторно викинути виняток після того, як перехопите його. Наступний приклад перехоплює виняток з числовим значенням та повторно викидає його, якщо значення більше за 50. Повторно викинутий виняток спливає наверх до замикаючої функції або на верхній рівень, так, що користувач його бачить.</p> + +<pre class="brush: js">try { + throw n; // викидає виняток з числовим значенням +} catch (e) { + if (e <= 50) { + // команди для обробки винятків 1-50 + } else { + // неможливо обробити цей виняток, тому викидаємо його повторно + throw e; + } +} +</pre> + +<h2 id="Специфікації">Специфікації</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Специфікація</th> + <th scope="col">Статус</th> + <th scope="col">Коментар</th> + </tr> + <tr> + <td>{{SpecName('ES3')}}</td> + <td>{{Spec2('ES3')}}</td> + <td>Початкове визначення. Реалізоване у JavaScript 1.4</td> + </tr> + <tr> + <td>{{SpecName('ES5.1', '#sec-12.13', 'throw statement')}}</td> + <td>{{Spec2('ES5.1')}}</td> + <td></td> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-throw-statement', 'throw statement')}}</td> + <td>{{Spec2('ES6')}}</td> + <td></td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-throw-statement', 'throw statement')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2> + + + +<p>{{Compat("javascript.statements.throw")}}</p> + +<h2 id="Див._також">Див. також</h2> + +<ul> + <li><a href="/uk/docs/Web/JavaScript/Reference/Statements/try...catch"><code>try...catch</code></a></li> +</ul> |