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