Глава22. Обработка исключительных ситуаций 635

// Вывести общую сумму элементов файла

cout « "¦ EXPENSE FILE TOTAL: ";

cout.unsetf(ios::left) ;

cout « setw(43}- « FileTotal « " ¦\n";

cout.setf(ios::left) ;

cout «"+============================^====="

/У Обработчики catch (EmployeeExceptionS EmpExp) {

cout « "\nError! ";

cout « EmpExp.Why() « " (Employee "

« EmpExp.GetEmployeeIDO « ")\ri";

} catch (ExpExceptionS Exp) {

cout « "VnError! " « Exp.Why() « "\n";

} catch (...) {

cout « "Caught an unrecognized exception.\n" }

// Закрыть входной файл — готово! inftie.close() ;

Для начала посмотрим, что не изменилось. Программа точно так же обрабатывает аргументы командной строки и, по крайней мере для функции main о, общий алгоритм обработки кажется прежним. Форматирование и вывод на экран заголовков и текстовых изысков остались неизменными.

Теперь займемся различиями. Самым очевидным изменением является то, что большая часть функции заключена в отдельный блок try — единственный блок try во всей программе. Это изменение позволяет свести всю обработку ошибок приложения в единый набор обработчиков.

В этом блоке try имеется три обработчика. Ни один из них явно не принимает ни один из конкретных типов исключительных ситуаций, определенных в файле expex.h. Вместо этого основная ответственность возлагается прежде всего на два универсальных обработчика, первый из которых перехватывает ЭКЗеМПЛЯрЫ ИСКЛЮЧИТелЬНЫХ ситуаций ТИПа EmployeeException, а

второй — остальные экземпляры ExpException. Замыкает список* обработчиков абсолютный обработчик, обеспечивающий уверенность в том, что никакие исключительные, ситуации не проскользнут незамеченными (в действительности они, разумеется, вообще не могут пройти незамеченными; необработанные исключительные ситуации просто завершили бы без лишних слов выполнение программы). Эти обработчики выводят на экран краткую