Глава 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(), поскольку та сама при необходимости спо-