Глава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. Замыкает список* обработчиков абсолютный обработчик, обеспечивающий уверенность в том, что никакие исключительные, ситуации не проскользнут незамеченными (в действительности они, разумеется, вообще не могут пройти незамеченными; необработанные исключительные ситуации просто завершили бы без лишних слов выполнение программы). Эти обработчики выводят на экран краткую