630____________ ________ ____Часть IV. Новые возможности C++
добавить в нее пару-тройку свежих ошибок. В результате внеочередная отладка программы займет у вас больше времени, чем ее переработка.
К счастью, приложение ExpSum2 снимает все эти проблемы.
ExpSum2: Отчет о расходах в современном стиле
Возможно, назвать программу ExpSum2 отчетом в современном стиле будет некоторым преувеличением, но это приложение, безусловно, является большим шагом вперед по сравнению с ExpSuml. Обработка исключительных ситуаций позволяет программе сосредоточить борьбу с ошибками в одном месте, не принося в жертву удобочитаемость и гибкость программы.
Иерархия классов исключительных ситуаций в ExpSum2. В листинге 22.31 показано содержимое заголовка expex.h. Этот новый заголовочный файл содержит определения типов исключительных ситуаций, используемых новой инфраструктурой обработки ошибок программы ExpSum2.
#ifndef EXCEPT_H
#define EXCEPT_H
// Необходимые заголовки
#include <cstring.h>
// Коды ошибок typedef enum (
EXP_NO_ERROR,
EXP_GENERIC_ERROR,
EXP_ERR _EXPENSE_TOO_SMALL,
EXP_ERR_EXPENSE_TOO _LARGE,
EXP_ERR_NO_EXPENSE_ITEMS,
EXP_ERR_TOO_MANY_EXPENSE_ITEMS,
EXP__ERR_rOTAL_EXPENSE_TOO LARGE } ErrorCode;
// Базовый класс исключительных ситуаций
class ExpException (
public:
ExpException(ErrorCode NewErrorCode,
const char* NewReason -= NULL) TheError(NewErrorCode), strTheReason(NewReason) ( )
void SetErrorCode(ErrorCode NewErrorCode)
( TheError = NewErrorCode; ) void SetReason(const strings strNewReason)
{ strTheReason == StrNewReason; )