MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

Основная информация

Инструкция throw позволяет генерировать исключения, определяемые пользователем. При этом выполнение текущей функции будет остановлено (инструкции после throw не будут выполнены), и управление будет передано в первому блоку catch в стеке вызовов. Если catch блоков среди вызванных функций нет, выполнение программы будет остановлено.

Синтаксис

throw выражение; 
выражение
Определяемое пользователем исключение.

Описание

Используйте инструкцию throw для генерирования исключения. Когда вы генерируете исключение (throw), выражение задает значение исключения. Каждое из следующих throw создает исключение:

throw "Error2"; // генерирует исключение, значением которого является строка
throw 42;       // генерирует исключение, значением которого является число 42
throw true;     // генерирует исключение, значением которого является логическое значение true

Также стоит отметить, что на инструкцию throw влияет автоматическая вставка точки с запятой (ASI). Поэтому не допускаются разрывы строк между инструкцией throw и выражением.

Примеры

Пример: Генерирование объекта в качестве исключения

Можно указать объект в качестве исключения. Затем можно получить ссылку на этот объект и доступ ко всем его свойствам в блоке catch. Следующий пример создает объект ошибки, который имеет тип UserException, и используется для генерации исключения.

function UserException(message) {
   this.message = message;
   this.name = "Исключение, определенное пользователем";
}
function getMonthName(mo) {
   mo = mo-1; // Нужно скорректировать номер месяца согласно индексам массива (1=Jan, 12=Dec)
   var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
      "Aug", "Sep", "Oct", "Nov", "Dec"];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException("Неверно указан номер месяца");
   }
}

try {
   // statements to try
   var myMonth = 15; // 15 находится вне границ массива, что приведет к исключению
   var monthName = getMonthName(myMonth);
} catch (e) {
   monthName = "неизвестен";
   logMyErrors(e.message, e.name); // передаем исключение в обработчик ошибок
}

Пример: Другой пример генерации объекта в виде исключения

Следующий пример проверяет, является ли строка, переданная в функцию, почтовым индексом США. Если индекс имеет недопустимый формат, будет сгенерировано исключение посредством создания объекта, имеющего тип ZipCodeFormatException.

/*
 * Создает объект ZipCode.
 *
 * Допустимые форматы почтового индекса:
 *    12345
 *    12345-6789
 *    123456789
 *    12345 6789
 *
 * Если агрумент, переданный в констуктор ZipCode не совпадает 
 * ни с одним из этих форматов, будет брошено исключение.
 */

function ZipCode(zip) {
   zip = new String(zip);
   var 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
   };
}

/*
 * Это может быть скрипт, который проверяет значение адреса
 * для США.
 */

var ZIPCODE_INVALID = -1;
var 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;
   }
}

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

Specification Status Comment
ECMAScript 3rd Edition Standard Initial definition.
Implemented in JavaScript 1.4
ECMAScript 5.1 (ECMA-262)
Определение 'throw statement' в этой спецификации.
Стандарт  
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'throw statement' в этой спецификации.
Стандарт  

Поддерживаемые браузеры

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Да) (Да) (Да) (Да) (Да)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Да) (Да) (Да) (Да) (Да) (Да)

Смотрите также

Метки документа и участники

Метки: 
 Внесли вклад в эту страницу: ZavodPodushek, Natalya_Surikova, sergey.bakaev, SphinxKnight, hellboy81
 Обновлялась последний раз: ZavodPodushek,