638 Часть IV. Новые возможности C++
собна генерировать исключительную ситуацию, которая будет перехвачена в функции main о. А во всем остальном, что не касается обработки ошибок, эта функция осталась той же, что и в программе ExpSuml.
Обработка статей расхода. Последней частью приложения ExpSum является функция processExpenseitem(), показанная в листинге 22.34.
float ProcessExpenseItemtif streams infile) {
Expense NewExpense;
// Прочитать из файла запись о расходах infile » NewExpense;
// Проверить ее корректность if (NewExpense.GetExpenseAmount() < MIN_ALLOWABLE_EXPENSE)*
throw ExpenseTooSmall() ;
if (NewExpense.GetExpenseAmount() > MAX_ALLOWABLE_EXPENSE)
throw ExpenseTooLarge();
// Вывести расходы на экран cout « " " « setw(lO) « NewExpense.GetDateО;
cout « setw(35) « NewExpense.GetDescription();
cout.unsetf(ios::left) ;
cout « setw(12) « NewExpense.GetExpenseAmount() « "\n" « setw(O) ;
cout.setf(ios::left) ;
return NewExpense.GetExpenseftmount();
}
Вас, наверное, удивило то обстоятельство, что метод обработки ошибок в этой функции напоминает таковой в функции processEmployeeO — контроль границ величины расходов реализован через генерацию исключительных ситуаций. А все остальное осталось так же, как в ExpSuml.
Уроки приложения ExpSum
Пример ExpSum демонстрирует некоторые из методов, которые вы можете реализовать в собственных программах. В то же время, вы быстро поймете, что эффективность обработки исключительных ситуаций отчасти зависит от вашего мастерства. Например, в зависимости от размера и сложности приложения, вам могло бы понадобиться сделать проверку ошибок многоэтапной, когда вложенные блоки try частично обрабатывают ошибочные состояния, а затем перенаправляют их для обработки окружающим блокам