Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на JavaScript

  Все выпуски  

Азы и секреты программирования на JavaScript.


Служба Рассылок Subscribe.Ru

Азы и секреты программирования на JavaScript.

Выпуск 13

JavaScript и обработка ошибок.

Я не ошибусь, если скажу, что любой Веб-мастер заинтересован в том, чтобы сделанные им страницы не содержали ошибок. Но часто не все зависит от нашей аккуратности. Нередки ситуации, когда в интернете заходишь на сайт серьезной компании, а твой веб-броузер выдает сообщение: "Страница содержит ошибки, продолжать выполнение сценариев на этой странице?". Такие окошки мне попадались даже на сайте MSDN при просмотре его содержимого в IE. Я думаю, нельзя обвинять разработчиков ТАКОГО сайта в неаккуратности. В чем-же причина? Надо полагать, что просто невозможно предусмотреть все возможные типы браузеров и версии из интерпретаторов сценариев. Кроме того, возможны проблемы с коннектом или загруженностью сайта. В общем, почва для ошибок всегда есть. Как же обеспечить корректную работу страниц в критической ситуации?

Для этих целей разработчики предусмотрели инструкции прехвата ошибок:

try...catch…finally

Инструкции try...catch...finally предоставляет способ обработки некоторых или всех возможных ошибок, которые могут происходить в выбранном блоке кода во время выполнения сценария. Если возникает ошибка, обработку которой программист не установил, JScript просто выдает обычное сообщение об ошибке пользователю, как будто не имелось никакой обработки ошибок.

Внутри инструкции try содержится код, где может возникнуть ошибка, а catch содержт код для обработки возникшей ошибки. Если ошибка возникает в границах инструкции try, программное управление передается к catch для обработки. Передаваемое начальное значение исключения содержит значение ошибки, которая возникла в блоке try. Если ошибок не возникает, блок catch не выполненяется.

Если ошибка не может быть обработана в блоке catch, связанном с соответствующим блоком try, где она произошла, используется инструкция throw, чтобы передать ошибку на обработчик верхнего уровня.

После того, как все инструкции в блоке try будут выполнены, и любая из ошибок была обработана в боке catch, всегда выполняются нструкции в блока finally.

Обратите внимание, что код внутри блока finally выполняется, даже если код возврата расположен происходит внутри блоков try или catch, или если блок catch перехватил ошибку верхнего уровня по throw. Инструкции в блоке finally не работают только если возникла необрабатываемая ошибка (например, ошибка времени выполнения внутри блока catch).

Рассмотрим типовой обработчик ошибок на примере:

try { print("Outer try running.."); try { print("Nested try running..."); throw "an error"; } catch(e) { print("Nested catch caught " + e); throw e + " re-thrown"; } finally { print("Nested finally is running..."); } } catch(e) { print("Outer catch caught " + e); } finally { print("Outer finally running"); } // для сценария под Windows Script Host код функции // надо заменить на: WScript.Echo(s) function print(s){ document.write(s); } В результате выполнения приведенного кода будет выведено следующее:

Outer try running..
Nested try running...
Nested catch caught an error
Nested finally is running...
Outer catch caught an error re-thrown
Outer finally running

Как использовать все вышесказанное? Проще всего поступать так: внутри блока try обычно располагаются все критические участки кода, которые по-вашему мнению могут вызвать при выполнении ошибки. А в блоке catch рамещают код для возможных действий системы на случай ошибок, или оставляют его просто пустым, чтобы подавить появление сообщений об ошибках на странице, которые вызывают у посетителя сомнения в способностях веб-мастера их создавших ;-). Для примера создадим небольшой HTML файл, который перенаправит броузер пользователя на альтернативный адрес при возникновении ошибки:

<xHTML> <xHEAD> <xTITLE> Новый документ <x/TITLE> <xMETA HTTP-EQUIV="Pragma" CONTENT="no-cache"> <xMETA HTTP-EQUIV="Content-Type" Content="text/html; Charset=Windows-1251"> <xMETA NAME="Author" CONTENT="B-Soft: Балезин И.В."> <xMETA NAME="Keywords" CONTENT=""> <xMETA NAME="Description" CONTENT=""> <x/HEAD> <xBODY> <x/BODY> <x/HTML> Если честно, я попробовал загрузить эту страничку в Netscape Communicator версии 4.05-рус, а он у меня матерится на инструкцию try, что я использовал зарезервированное слово. А на страницах Netscape решения этой проблемы я не нашел - увы. Поэтому я и предпочтаю IE.

Кстати, полный справочник по инструкциям для JScript 5.5 с примерами уже есть на http://www.b-soft.ru/scripting/.

Материалы для Web-мастера.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное