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;
   }
}

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

Специфікація Статус Коментар
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 Latest Draft (ECMA-262)
The definition of 'throw statement' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
throwChrome Full support YesEdge Full support 12Firefox Full support 1IE Full support 5Opera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також