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. Искл ю чения и обработка ошибок

