Основы программирования на JavaScript | страница 59



можно применять в любом месте. Однако, обычно, код должен быть написан таким образом, чтобы это не нужно было использовать, - в частности, весь ввод должен проверяться.

Блок Try/Catch можно применять также для создания своих собственных ошибок:


function setAge(x){

if(typeof(x)=='undefined') throw('Вы должны ввести возраст');

if(typeof(x)!='number') throw('Возраст должен быть числом');

if(x<0) throw('Возраст не может быть меньше 0');

if(x>120) throw('Возраст не может быть больше 120');

var myAge = x;

// еще код

}

try{

setAge(userInput);

}catch(err){

alert(err);

}


В этом случае выполняется проверка того, что пользователь вводит возраст. Если он вводит недопустимые данные, сценарий немедленно завершается, а пользователь получает сообщение об ошибке.

Блок try/catch имеет еще одну часть, оператор finally:


try{

// код

}catch(err){

// код

}finally{

// код

}


Код в "завершающем блоке" будет выполняться независимо от того, что происходит с операторами Try/Catch. В чем же разница между завершающим блоком и простым размещением кода после блока try/catch? В большинстве случаев никакой разницы не будет. Однако, если блок try/catch находится в функции и происходит выход из функции в блоке try или catch, то возникнет существенное различие:


function myFunction(){

try{

return someValue;

}catch(err){

return defaultValue;

}finally{

alert('finally!');

}

alert('End!');

}


В этом случае оба блока try и catch возвращают значение. Мы получим сообщение "finally!", но не получим сообщение "End!", потому что произойдет выход из функции до сообщения alert('End!'). То же самое остается справедливым для операторов Try/Catch, которые осуществляют выход из тела цикла for или while, например:


for(var i=0; i<10; i++){

try{

if(i==5) continue;

}catch(err){

// обработка ошибки

}finally{

// код

}

// еще код

}


Запросы XMLHttp, рассмотренные в предыдущей лекции, могут иметь совершенно другой тип ошибки: данные просто не проходят. Это можно проверить через статус объекта XMLHttp:


function processingFunction(){

if(oXml.readyState!=4) return; // запрос не выполнен

switch(oXml.status){

case 0: case 200: // запрос выполнен

break;

case 408: case 504: // запрос превысил время ожидания

// код

break;

default: // ошибка запроса

// код

return; // возможно, вы захотите выйти

break;

}