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

