JavaScript. Подробное руководство, 6-е издание
Часть 57 из 535 Информация о книге
Следующий фрагмент иллюстрирует синтаксис и назначение инструкции
:<b>try/catch/finally</b><b>try {</b><b> // Обычно этот код без сбоев работает от начала до конца.</b><b> // Но в какой-то момент в нем может быть сгенерировано исключение </b><b> // либо непосредственно с помощью инструкции throw, либо косвенно -</b><b> // вызовом метода, генерирующего исключение.</b><b>}</b><b>catch (е) {</b><b> // Инструкции в этом блоке выполняются тогда и только тогда, когда в блоке try </b><b> // возникает исключение. Эти инструкции могут использовать локальную переменную е,</b><b> // ссылающуюся на объект Error или на другое значение, указанное в инструкции throw. </b><b> // Этот блок может либо некоторым образом обработать исключение, либо </b><b> // проигнорировать его, делая что-то другое, либо заново сгенерировать </b><b> // исключение с помощью инструкции throw.</b><b>}</b><b>finally {</b><b> // Этот блок содержит инструкции, которые выполняются всегда, независимо от того,</b><b> // что произошло в блоке try. Они выполняются, если блок try завершился:</b><b> // 1) как обычно, достигнув конца блока</b><b> // 2) из-за инструкции break, continue или return</b><b> // 3) с исключением, обработанным приведенным в блоке catch выше</b><b> // 4) с неперехваченным исключением, которое продолжает свое</b><b> // распространение на более высокие уровни</b><b>}</b>Обратите внимание, что за ключевым словом catch следует идентификатор в скобках. Этот идентификатор похож на параметр функции. Когда будет перехвачено исключение, этому параметру будет присвоено исключение (например, объект
). В отличие от обычной переменной идентификатор, ассоциированный с конструкцией<b>Error</b>, существует только в теле блока<b>catch</b>.<b>catch</b>Далее приводится более реалистичный пример инструкции
. В нем вызываются метод<b>try/catch</b>определенный в предыдущем разделе, и методы<b>factorial(),</b>и<b>prompt()</b>клиентского JavaScript для организации ввода и вывода:<b>alert()</b><b>try {</b><b> // Запросить число у пользователя</b><b> var n = Number(prompt("Введите положительное число",""));</b><b> // Вычислить факториал числа, предполагая, что входные данные корректны </b><b> var f = factorial(n);</b><b> // Вывести результат </b><b> alert(n + "! = " + f);</b><b>}</b><b>catch (ex) { // Если данные некорректны, управление будет передано сюда</b><b> alert(ех); // Сообщить пользователю об ошибке</b><b>}</b>Это пример инструкции
без конструкции<b>try/catch</b>. Хотя<b>finally</b>используется не так часто, как<b>finally</b>, тем не менее иногда эта конструкция оказывается полезной. Однако ее поведение требует дополнительных объяснений. Блок<b>catch</b>гарантированно исполняется, если исполнялась хотя бы какая-то часть блока<b>finally</b>, независимо от того, каким образом завершилось выполнение программного кода в блоке<b>try</b>. Эта возможность обычно используется для выполнения заключительных операций после выполнения программного кода в предложении<b>try</b>.<b>try</b>В обычной ситуации управление доходит до конца блока
, а затем переходит к блоку<b>try</b>, который выполняет необходимые заключительные операции. Если управление вышло из блока<b>finally</b>как результат выполнения инструкций<b>try</b>,<b>return</b>или<b>continue</b>, перед передачей управления в другое место выполняется блок<b>break</b>.<b>finally</b>Если в блоке
возникает исключение и имеется соответствующий блок<b>try</b>для его обработки, управление сначала передается в блок<b>catch</b>, а затем - в блок<b>catch</b>. Если отсутствует локальный блок<b>finally</b>, то управление сначала передается в блок<b>catch</b>, а затем переходит на ближайший внешний блок<b>finally</b>, который может обработать исключение.<b>catch</b>Если сам блок
передает управление с помощью инструкции<b>finally</b>,<b>return</b>,<b>continue</b>или<b>break</b>или путем вызова метода, генерирующего исключение, незаконченная команда на передачу управления отменяется и выполняется новая. Например, если блок<b>throw</b>сгенерирует исключение, это исключение заменит любое ранее сгенерированное исключение. Если в блоке<b>finally</b>имеется инструкция<b>finally</b>, произойдет нормальный выход из метода, даже если генерировалось исключение, которое не было обработано.<b>return</b>