Оператор try...catch
Оператор try...catch помечает блок операторов, пытается их выполнить и специфицирует один или более вариантов ответа при возникновении исключения. Если исключение возникло, оператор try...catch отлавливает его.
Оператор try...catch состоит из блока try, который содержит один или более операторов, и нуль или более блоков catch, содержащих операторы, которые специфицируют действия при вызове исключения в блоке try. То есть, если Вы хотите выполнить блок try и он не выполняется, Вы передаёте управление в блок catch. Если любой оператор блока try (или оператор функции, вызываемой из блока try) вызывает исключение, управление немедленно передаётся в блок catch. Если исключение не было вызвано, блок catch пропускается. Блок finally выполняется после выполнения блоков try и catch, но до выполнения оператора, идущего после блока оператора try...catch.
В следующем примере используется оператор try...catch. Вызывается функция, которая запрашивает название месяца из массива, базируясь на значении, передаваемом функции. Если значение не соответствует номеру месяца (1-12), вызывается исключение со значением "InvalidMonthNo" и операторы блока catch устанавливают переменную в monthName значение "unknown".
function getMonthName (mo) {
mo=mo-1; // Уточняется номер месяца по индексу массива (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 {
throw "InvalidMonthNo"
}
}
try {
// попытка выполнить эти операторы:
monthName=getMonthName(myMonth) // функция может вызвать исключение
}
catch (e) {
monthName="unknown"
logMyErrors(e) // объект, вызвавший исключение, передаётся обработчику исключений
}
Блок catch
Вы можете использовать единственный блок catch для обработки всех исключений, которые могут быть сгенерированы в блоке try, или можете использовать отдельные блоки catch для обработки определённых типов исключений.
Единственный блок catch
Используйте единственный в данном операторе try...catch блок catch (восстанавливающий блок) для выполнения кода обработки ошибок для каждого исключения, вызываемого в блоке try.
Единственный блок catch имеет следующий синтаксис:
catch (catchID) {
statements
}
Блок catch специфицирует идентификатор (catchID в предыдущем синтаксисе), по которому содержится значение, специфицированное оператором throw; Вы можете использовать этот идентификатор для получения информации о вызванном исключении. JavaScript создаёт этот идентификатор при входе в блок catch; идентификатор существует только в период выполнения блока catch; после завершения выполнения блока catch идентификатор больше не доступен.
Например, следующий код вызывает исключение. Если возникает исключение, управление передаётся в блок catch.
try {
throw "myException" // генерируется исключение
}
catch (e) {
// операторы для обработки любого исключения
logMyErrors(e) // исключение передаётся обработчику ошибок
}
Несколько блоков catch
Единственный оператор try может содержать несколько условных блоков catch, каждый из которых обрабатывает специфический тип исключения. В этом случае вход в подходящий условный блок catch выполняется только при вызове исключения, специфицированного для данного блока. Вы можете также по выбору включить отдельный блок catch для всех неспецифицированных исключений как финальный блок catch в операторе.
Например, следующая функция вызывает три другие функции (объявленные в другом месте), которые проверяют её аргументы. Если проверяющая функция определяет, что проверяемый компонент неверен, она возвращает 0, заставляя вызывающую функцию вызывать определённое исключение.
function getCustInfo(name, id, email)
{
var n, i, e;
if (!validate_name(name))
throw "InvalidNameException"
else
n = name;
if (!validate_id(id))
throw "InvalidIdException"
else
i = id;
if (!validate_email(email))
throw "InvalidEmailException"
else
e = email;
cust = (n + " " + i + " " + e);
return (cust);
}
Условные блоки catch управляют вызовом соответствующего обработчика исключений.
try {
// функция может вызвать три вида исключений
getCustInfo("Lee", 1234, "lee@netscape.com")
}
catch (e if e == "InvalidNameException") {
// вызывает обработчик неправильных имён
bad_name_handler(e)
}
catch (e if e == "InvalidIdException") {
// вызывает обработчик неправильных ids/идентификаторов
bad_id_handler(e)
}
catch (e if e == "InvalidEmailException") {
// вызывает обработчик неправильных email-адресов
bad_email_handler(e)
}
catch (e){
// незвестное исключение записывается в log-файл
logError(e)
}
Блок finally
Блок finally содержит операторы, выполняемые после выполнения блоков try и catch, но до выполнения операторов, идущих после оператора try...catch. Блок finally выполняется независимо от того, было ли вызвано исключение. Если исключение вызывается, операторы блока finally выполняются даже в том случае, если ни один блок catch не обработал исключение.
Вы можете использовать блок finally для корректного завершения скрипта при возникновении исключения; например, Вам может понадобиться освободить ресурс, связанный скриптом. В следующем примере файл открывается и операторы работают с ним (серверный JavaScript даёт возможность доступа к файлам). Если вызывается исключение при открытом файле, блок finally закрывает файл до того, как скрипт потерпит неудачу.
openMyFile();
try {
writeMyFile(theData)
}
finally {
closeMyFile() // ресурс всегда закрывается
}
Вложение операторов try...catch
Вы можете вкладывать один или более операторов try...catch друг в друга. Если внутренний оператор try...catch не имеет блока catch, на совпадение проверяется блок catch содержащего его оператора try...catch.
Copyright © 2000 Все Права Зарезервированы.
Дата последнего обновления 28 сентября 2000 года.
Содержание раздела