Глава 22. Обработка исключительных ситуаций 625

контекстные ошибки (расходы, которые слишком велики или слишком малы, неверное число служащих или неверное число отчетов о расходах и т. д.). ExpMaker не препятствует созданию неправильных файлов с информацией о расходах, так как с их помощью можно протестировать прочность защиты от ошибок обоих вариантов программы ExpSum. В противном случае, если бы программа ExpMaker гарантировала правильность информации в файлах, то определить, работает логика обработки исключительных ситуаций, было бы очень трудно.

ExpSum 1: Отчет о расходах в традиционном стиле

Взглянем на первое из упомянутых приложений, ExpSuml. Эта программа, представленная в листинге 22.30, состоит из трех функций:

ProcessExpenseItemO, ProcessEmployee () И ina.in(). При ЧТСНИИ ИСХОДНОГО текста обратите особое внимание на то, как программа сообщает об ошибках и передает их через каждую из своих функций.

h06251.jpg

/'/ Необходимые заголовки ^include <fstream.h> ^include <iomanip.h> ftinclude <empioyee,h> ftinclude <expense.h>

// Определения

const int. MIN_ALLOWABLE_EMPLOYEES = 1;

const int M.'^X_ALLOWABLE__EMPLOYEES = 20;

const int MIN_NUM_EXPENSES = 1;

const int MAX_NUM_EXFENSES = 10;

const float MIN_ALLOWABLE__EXPENSE = l.OF;

const float MAX_ALLOWABLE_EXPENSE = 1000.OF;

const float MftX_AI,I,OWflBLE_REIMBURSEMENT = 5000. OF;

// Коды ошибок typedef enura {

EXP_NO_ERROR,

EXP_ERR_KXPENSE_TOO__SMALL,

EXP_ERR_EXPEHSE_TOO_ IiARGE,

EXP_ERR_NO_EXPENSE ITEMS,

EXP_ERR_TOO_MANY_EXPENSE_ITEMS,

EXP__ERR_TOTAL_EXPENSE_TOO_LARGE } ErrorCode;

float ProcessExpenseItem(ifstream& infile, ErrorCodeS re)

Expense NewExpense;