Page 201 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 201

d :   вызываем  с
       с  :   генерируем  ошибку
                         e
       c@debugger  eval  cod : l З : l
                         e
       d@debugger  eval  cod : 1 8  : 4
                        e
       @debugger  eval  cod : 2 9 : 4
          Строки со знаком @  означают трассировку стека,  которая начинается с "самой
       глубокой" функции (с) и завершается без функции вообще (сам браузер). Как можно
       заметить, имеется две разных трассировки стека.  В первой мы видим, что функция
       с  была вызвана из Ь, а та, в свою очередь, была вызвана из а.  Во второй  видно, что
       функция с была вызвана непосредственно из d.


                                               .
                               .
       Конструкция       try  . .   catch  . .   finally
          Иногда в  коде блока t ry задействуется  некий  ресурс,  такой  как подключение
       к серверу НТТР или открытие файла. Вне зависимости от ошибки мы должны ос­
       вободить этот ресурс, чтобы он не был постоянно связан с нашей программой. По­
       скольку блок try может содержать любое количество операторов, в каждом из кото­
       рых может возникнуть ошибка, поэтому блок  r y не самое безопасное место для ос­
                                                 t
       вобождения ресурса (поскольку ошибка может произойти прежде, чем представится
       шанс сделать это). Также небезопасно освобождать ресурс в блоке catch, поскольку
       он не выполняется, если не будет ошибки. Это именно та ситуация, которая требует
       блока finally, выполняемого вне зависимости от наличия ошибки.
          Поскольку мы  еще  не  рассматривали  работу с  файлами  или  подключениями
                                                  a
       к серверу НТТР, для демонстрации блока fin l l y   мы будем просто использовать
       пример с операторами console . log.
       try
                                           .
           console . l og ( "Этa  строка  вьmолнена  . .   " ) ;
           throw  new  Error ( " Yп ! " ) ;
                             c
                      (
           console . log  " Эта  строка  не  вьmолняется  . .  . " )   ;

         catch  e rr)  {
              (
           console . log ( "Была  ошибка  . .  . " ) ;

         finally  {
           console . l og ( "   .  .  . вceгдa  выполняется" ) ;

                      (
           console . log  " Здесь  вьmолняется  очистка" )   ;
          Опробуйте этот  пример с оператором  throw и  без  него;  вы увидите, что блок
       finally выполняется в любом случае.








       202      Глава  11. Исключения и обработка ошибок
   196   197   198   199   200   201   202   203   204   205   206