638 Часть IV. Новые возможности C++

собна генерировать исключительную ситуацию, которая будет перехвачена в функции main о. А во всем остальном, что не касается обработки ошибок, эта функция осталась той же, что и в программе ExpSuml.

Обработка статей расхода. Последней частью приложения ExpSum является функция processExpenseitem(), показанная в листинге 22.34.

h06381.jpg

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 частично обрабатывают ошибочные состояния, а затем перенаправляют их для обработки окружающим блокам