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

class TooManyExpenseItems : public EmployeeException

{

public:

TooManyExpenseItems(unsigned NewEmployeeID) :

EmployeeExcept ion(EXP_ERR__TOO_MANY_EXPENSE_ITEMS, NewEmployeeID,

"Too many expense items for this employee") ( } };

class ExpenseTotalTooLarge : public ExpException

{ '

public:

ExpenseTotalTooLarge() :

ExpException(EXP_ERR_TOTAL_EXPENSE_TOO_LARGE,

"Expense total greater than maximum amount " "eligible for reimbursement.") { } };

#endif

Иерархия классов исключительных ситуаций, используемая в ExpSum2, для программы такого объема разработана, пожалуй, даже чересчур тщательно. Для приложений длиной всего в пару страниц число обрабатываемых типов исключительных ситуаций обычно невелико; избыточная иерархия в листинге 22.31 демонстрирует некоторые функциональные возможности, которые, вероятно, лучше подошли бы значительно большим по объему программам. На рис. 22.2 иерархия классов исключительных ситуаций представлена в графическом виде.

Самым верхним классом исключительных ситуаций является класс ExpException. Этот родовой класс обеспечивает простейший сервис обработки ошибок. При генерации исключительной ситуации класс ExpException может задать код ошибки и необязательное ее описание, но возможность передачи какой-либо другой информации отсутствуют. Тем не менее даже с одним только классом ExpException благодаря наличию строки с описанием исключительной ситуации обработка ошибок в программе ExpSum2 становится значительно мощнее, чем в ExpSuml.

Новые классы исключительных ситуаций наследуются от класса ExpException. Эта иерархия классов использует две различных стратегии. Классы, производные от ExpException, служат для конкретизации ошибок. Хотя фактически любую ошибку можно было бы представить классом ExpException, классы вроде ExpenseTooSmall оставляют гораздо меньше простора для догадок о том, что же именно пошло не так. При такой иерархии классов и с таким уровнем детализации вы можете выбирать, будет ли ваше приложение взаимодействовать с ошибками абстрактно, обрабатывая все исключительные ситуации, как это делает класс ExpExceptions, или же конкретно, обрабатывая исключительные ситуации в соответствии с их фактическим типом.