Глава 22. Обработка исключительных ситуаций 637
// Прочитать запись о служащем из файла infile » NewEmployee;
// Проверить ее корректность if (NewEmployee.GetNumExpenses() < MIN_NUM_EXPENSES)
throw NoExpenseItems(NewEmployee.GetID() ) ;
if (NewEmployee.GetNumExpenses() > MRX_NUM_EXPENSES)
throw TooManyExpenseItems(NewEmployee.GetID()) ;
// Вывести запись о служащем cout « "Employee #" « NewEmployee.GetlIDO « "\n";
cout « NewEmployee.GetFirstName() « " ";
cout « NewEmployee.GetMiddleInitial() « ". ";
cout « NewEmployee.GetLastName () « "\n";
cout « NewEmployee.GetAddress() « '\n";
cout « NewEmployee. GetCity ()«",";
cout « NewEmployee.GetStatef) « " ";
cout « NewEmployee. Get ZipO « "\n\n";
// Извлечь запись расходов • cout « " Expenses\n'';
cout « " _----——------\n";
for (loop = 0; loop < NewEmployee.GetNumExpenses(); loop++) EmployeeTotal += ProcessExpenseItem(infile);
// Проверить
if (EmployeeTotal > MAX_ALLOWABLE_REIMBURSEMENT) throw ExpenseTotalTooLarge();
// Вывести итог по служащему cout « " ================================"
cout « " Employee Total:";
cout.unsetffios::left) ;
cout « setw(42) « EmployeeTotal « "\n\n\n";
cout. setf (ios::left);
return EmployeeTotal;
Эта функция ощутимо изменилась. Большая часть системы контроля ошибок программы ExpSumI здесь заменена эквивалентным механизмом обработки исключительных ситуаций. Функция processEmployee () проверяет различные условия и если что-то неправильно генерирует исключительную ситуацию. Функция processEmnployeeO не разменивается на мелочи вроде вывода на экран сообщений об ошибке или установки кодов возврата. Часть этих задач теперь стала излишней, а остальные перекладываются на список обработчиков функции main ().
Заметьте также, что функция ProcessEmployee о не проверяет ошибки вызова функции processExpenseitem(), поскольку та сама при необходимости спо-