Руководство по actionscript. часть 2, стр. 095
Вложенные исключения
До сих пор мы использовали только одноуровневые инструкции try/catch/ finally, однако логика обработки исключений может быть и вложенной. Инструкция try/catch/finally может размещаться внутри блока try, catch или finally другой инструкции try/catch/finally. Такое иерархическое вложение позволяет любому блоку инструкции try/catch/finally выполнять код, который, в свою очередь, может генерировать исключения.
Предположим, что мы создаем многопользовательское веб-приложение, представляющее доску объявлений. Мы определяем следующие классы: BulletinBoard — основной класс приложения, GUIManager — класс, управляющий пользовательским интерфейсом, и User — класс, который представляет пользователя на доске. В классе BulletinBoard мы описываем метод populateUserList ( ), который отображает список активных пользователей на текущий момент. Выполнение мето-дapopulateUserList ( ) состоит из двух этапов: на первом этапе метод получает экземпляр класса List из экземпляра класса GUIManager нашего приложения. Класс List представляет отображаемый на экране список пользователей. Затем метод populateUserList ( ) заполняет экземпляр класса List пользователями из переданного массива экземпляров класса User. На обоих этапах существует потенциальная возможность возникновения исключения, поэтому в методе populateUserList ( ) используется вложенная структура try/catch/finally. Рассмотрим эту вложенную структуру поближе.
EcлинaпepвoмэтaпeвыпoлнeниямeтoдapopulateUserList ( ) экземпляр класса List окажется недоступным, будет сгенерировано исключение UserLis tNotFound экземпляром класса GUIManager. Исключение UserLi s tNotFound обрабатывается внешней инструкцией try/catch/finally.
Если, с другой стороны, экземпляр класса List окажется доступным, метод populateUserList ( ) перейдет к выполнению второго этапа, где с помощью цикла заполнит экземпляр класса List пользователями из переданного массива. На каждой итерации цикла, если ID текущего пользователя не может быть найдено, метод User. gelD ( ) генерирует исключение UserldNotSet. Оно обрабатывается вложенной инструкцией try/catch/finally.
Рассмотрим этот код:
public function populateUserList (users:Array):void { try {
// Приступаем к выполнению этапа 1… получаем экземпляр класса List. // Если метод getllserListC ) сгенерирует исключение, будет выполнен // внешний блок catch.
var ulist:List = getGUIManager( ).getUserList( ); // Приступаем к выполнению этапа 2… заполняем экземпляр класса List, for (var i-.Number = 0; i < users.length: i++) { try {
var thisUser:User = User(users[i]);
// Если метод getID( ) сгенерирует исключение, будет выполнен // вложенный блок catch. В противном случае пользователь будет // добавлен в экземпляр класса List вызовом метода addltem( ). ulist. addItem(thisUser. getName( ). thisUser. getID( )); } catch (e:UserIdNotSet) { trace(e. message);
continue; // Пропускаем этого пользователя.
}
}
} catch (e:UserListNotFound) { trace(e. message);
}
}
Теперь, когда мы рассмотрели конкретный пример вложенного исключения, познакомимся с общим процессом обработки вложенных исключений.