Throw
Вызывает определяемое пользователем исключение.
| Реализован в | JavaScript 1.4 | ||
| Версия ECMA | ECMA-262, Edition 3 | 
 Синтаксис
throw expression;
 Параметры
| expression | 
Значение для throw.
 Описание
Использование оператора throw для вызова исключения. Если вы вызываете исключение, оно специфицирует значение для исключения. Вот вызовы нескольких исключений.
throw "Error2";    // генерирует исключение со строковым значением
throw 42;          // генерирует исключение с числовым значением 42
throw true; // генерирует исключение со значением true
 Примеры
Пример 1: Отлов объекта.
При отлове исключения Вы можете специфицировать объект. Затем Вы можете обращаться к свойствам объекта в блоке catch. В этом примере создаётся объект myUserException типа UserException, и он используется в операторе throw.
function UserException (message) {
   this.message=message;
   this.name="UserException";
}
function getMonthName (mo) {
   mo=mo-1; // Уточняет число month относительно индекса массива (1=Jan, 12=Dec)
   var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
      "Aug","Sep","Oct","Nov","Dec");
   if (months[mo] != null) {
      return months[mo];
   } else {
      myUserException=new UserException("InvalidMonthNo");
      throw myUserException;
   }
}
try {
   // операторы для try;
   monthName=getMonthName(myMonth)
}
catch (e) {
   monthName="unknown";
   logMyErrors(e.message,e.name); // передаёт объект исключения обработчику ошибок
}
Пример 2: Отлов объекта.
Здесь тестируется строка для ввода zip-кода США. Если zip-код использует неверный формат, оператор throw вызывает исключение, создавая объект типа ZipCodeFormatException.
/*
 * Создаётся объект ZipCode.
 *
 * Принимаемые форматы zip-кода:
 *    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)) {
      // значением 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 = 
      "does not conform to the expected format for a zip code";
   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
Пример 3: Повторный вызов исключения.
Вы можете использовать throw для повторного вызова исключения после его отлова. Следующий пример отлавливает исключение с числовым значением и вызывает его повторно, если его значение больше 50. Повторно вызванное исключение передаётся в содержащую функцию, или на верхний уровень так, чтобы пользователь увидел его.
try {
   throw n // вызывает исключение с числовым значением
}
catch (e) {
   if (e <= 50) {
      // операторы для обработки исключений 1-50
   }
   else {
      // не может обработать это исключение, поэтому вызывает его повторно
      throw e
   }
}
