8c1dea14

Оператор 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 года.


Содержание раздела