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

function  billPay ( a mount,  рауее,  account )
           i f ( a mount  >  account . b alance )
               throw  new  Error ( "Maлo  дене . " ) ;
                                        г
           account . tran f er ( p ayee ,  amount )  ;
                      s

          При выполнении  оператора  t h row текущая  функция  немедленно  прекращает
       свою работу. Поэтому в нашем примере вызова метода account .  r ansfer не будет,
                                                                  t
       что нам и требовалось.

       Обработка исключе н и й и стек вызовов

          Типичная программа вызывает функции, а эти функции, в свою очередь, вызы­
       вают другие функции, а эти функции - следующие функции и т.д. Интерпретатор
       JavaScript должен отслеживать их все. Если функция а вызывает функцию Ь, а функ­
       ция Ь вызывает функцию с, то, когда функция с завершает работу, управление воз­
       вращается  функции Ь, а когда завершается функция Ь, управление возвращается
       функции а. Поэтому, когда выполняется функция  с, функции а  и Ь "ожидают': Эти
       вложенные функции, которые еще не завершили работу, формируют стек вызовов
       ( call stack).
          Если в  функции  с  происходит  ошибка,  то что будет с функциями  а  и  Ы  Оче­
       видно, что в  функции Ь также возникнет ошибка,  поскольку в ней может исполь­
       зоваться значение, возвращаемое функцией  с.  Это в свою очередь вызовет ошибку
       в функции а, поскольку в ней также может использоваться значение, возвращаемое
       функцией Ь. По существу, ошибка будет распространяться по стеку вызовов вверх,
       пока не будет перехвачена и обработана.
          Ошибки могут быть перехвачены и обработаны на любом уровне в стеке вызо­
       вов. Если они так и не будут перехвачены, интерпретатор JavaScript просто остано­
       вит программу. Это явление называется необработанным исключением ( unhandled
       exception) или не перехваченным исключением (uncaught exception), оно всегда при­
       водит к аварийному завершению программы. С учетом количества мест, где может
       произойти ошибка, перехват всех возможных ошибок, способных привести к ава­
       рийному завершению программы, становится трудоемким и громоздким.
          Когда ошибка перехватывается, стек вызовов предоставляет полезную инфор­
       мацию для диагностики проблемы. Например, если функция а  вызывает функцию
       Ь, которая вызывает функцию с и ошибка происходит в функции с, то стек вызовов
       говорит нам не только о том, что ошибка произошла в функции с, но и что она про­
       изошла, когда эта функция была вызвана функцией Ь, когда она была вызвана функ­
       цией  а.  Это  полезная информация, если функция  с  вызывается из многих разных
       мест в вашей программе.





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