В этой статье мы познакомимся с jscript инструкцией throw js сценариев. Инструкция throw позволяет в сценариях js генерировать исключительную ситуацию, которая впоследствии, может обрабатываться конструкцией try catch. Может возникнуть логический вопрос – зачем генерировать исключительную ситуацию (ошибку), если можно просто задать условие, при котором будет происходить простой вывод сообщения?
Как не странно, но это так, следующий пример это демонстрирует:
// ***************************************************************** // Пример создания исключительной ситуации (js throw) // throw.js // ***************************************************************** function summ(){ var s=0; for (var i=0; i<=100; i++){ s+=i; } return s; //5050 } WScript.echo (summ()); function summ1(){ var s=0; for (var i=0; i<=100; i++){ s+=i; if (s>1000){ WScript.Echo ("Переменная s больше 1000"); break; } } return s; //500 } WScript.echo (summ1()); function summ2(){ var s=0; for (var i=0; i<=100; i++){ try { s+=i; if (s>1000) throw new Error("Переменная s больше 1000"); }catch(e){ if (e!=0){ WScript.Echo (e.description); break; } } } return s; //500 } WScript.echo (summ2()); |
В данном примере мы прописали три функции (sum(), summ1() и summ2()), все они выполняют практически одну задачу – нахождение суммы чисел от 0 до 100. В первой функции мы получим результат в 5050, а во-вторых – 1035. В функции summ1() мы прописали условие, что если переменная s будет больше или ровно 1000, то произвести выход из цикла с помощью оператора break. В функции summ2() мы использовали js throw инструкцию, видим, что после нее идет создание объекта Windows Script Host – Error, в качестве параметра мы передали ему сообщение: «Переменная s больше 1000», то есть, мы генерировали собственную ошибку с условие появления при s больше или ровно 1000. Что бы данную ошибку обработать, используется конструкция try catch. Видим, что тут мы тоже прописали оператор break.
Стоит учитывать, что после оператора throw может следовать не только новый объект Error, но и простая строка или число:
// ***************************************************************** // Пример создания исключительной ситуации (js throw) // throw_1.js // ***************************************************************** function new_summ(){ var s=0; for (var i=0; i<=100; i++){ try { s+=i; if (s>1000) throw "Переменная s больше 1000"; }catch(e){ if (e!=0){ WScript.Echo (e); break; } } } return s; //500 } WScript.echo (new_summ()); |
Как видим, в данном случае мы после throw просто прописали строку «Переменная s больше 1000».
Хорошо, теперь, давайте рассмотрим следующий пример:
// *********************************************************** // Пример создания исключительной ситуации (js throw) // throw_2.js // *********************************************************** var i=0, msg="Результат деления 15 на\n\n", e, msg_err="Ошибка деления!!!\n\n"; // Объявляем функцию my_fun var my_fun = function(x,y){return x +y;} // Объявляем объект my_obj var my_obj = {a:10, b:100}; // Объявляем массив my_arr из 7 элементов! var my_arr=[5, 7.5, 0,"строка",2, my_fun, my_obj]; while (i <= 7) { //результат деления var result; try{ result=15/my_arr[i]; //генерируем сообщение об ошибке if (!isFinite(result)) throw new Error("my_arr[" + i + "]: " + my_arr[i]); }catch(e){ if (e!=0){ msg_err+=e.description + "\n"; } }finally{ if (isFinite(result)) msg+="my_arr[" + i + "]: " + my_arr[i] + " \tровно: " + result + "\n"; i++; } } WScript.echo (msg + "\n" + msg_err); |
В данном примере мы создали массив my_arr, который состоит из 7 элементов, числа, строка, функция и объект, причем, одно из чисел ровно 0. В цикле происходит деление числа 15 на каждый элемент массива. При делении на ноль, строку, функцию и объект ошибки не произойдёт, так как сам язык Jscript вернёт типы данных NaN – не число и infinity – бесконечность. Что бы вручную генерировать сообщение об ошибке, мы использовали оператор throw в js сценарии. Есть функция isFinite(х), которая вернёт true лишь в том случае, если переменная х не имеет тип данных NaN или infinity.
Используя данную функцию, мы прописали условие:
if (!isFinite(result)) throw new Error(«my_arr[» + i + «]: » + my_arr[i]);
Само сообщение об ошибке будет храниться в переменной msg_err, а переменная msg будет хранить только правильный результат деления.