Утилита класса для временного хранения информации об ошибках? - PullRequest
3 голосов
/ 25 мая 2011

Я писал легковесный фреймворк, чтобы обернуть Windows API для личных проектов и повеселиться.Хороший метод проектирования, по моему мнению, заключается в том, что каждый класс в платформе управляет собственной информацией об ошибках, когда что-то идет не так.У меня есть простой класс ошибок, например, так:

class Error
{
public:

    struct ErrorData
    {
        DWORD       sysErrCode;
        tstring     sysErrStr;
        SYSTEMTIME  localTime;
        tstring     errMsg;
        tstring     funcCall;
        tstring     parentClass;
    };
    void getErrorData(ErrorData *pErrorData);
    Error(const tstring parentClass);
    void setErrorData(const tstring errMsg, const tstring funcCall, const bool getSysErr = false);

private:

    ErrorData errorData;
    void getSystemError(DWORD &sysErrCode, tstring &sysErrStr);
};

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

Любые идеи приветствуются!Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

Прежде всего, я рекомендую использовать исключения для управления ошибками.У вас может быть один тип исключения, который используется в одностороннем порядке в вашем приложении, или вы можете создать иерархию типов исключений, которые специализируются для определенных классов.

Если вы не хотите идти по этому маршруту, вы можетепо-прежнему избавляясь от необходимости реализовывать специальную функцию получения ошибок в каждом из ваших классов, вы можете использовать наследование довольно безболезненно.Просто создайте базовый класс, от которого наследуются все объекты с управлением ошибками, и один раз реализуйте метод получения в базовом классе:

class ErrorManager
{
    const Error& getError();
    void setError( Error& err );  // Or however you would actually set the error
}

class Widget : public ErrorManager
{
    // Implementation details
}

Widget w;
w.getError()

Хотя вы думаете, что наследование кажется неправильным, оно действительно вполне уместно.Вы правы, что диалог не является ошибкой.Тем не менее, он имеет have-a Error, и вы можете управлять взаимодействием с этой ошибкой, используя наследование.Поэтому ваш диалог является ErrorManager, поскольку он использует общую структуру для управления своими ошибками.

Удачи!

0 голосов
/ 25 мая 2011

Рассматривали ли вы использование исключений и throw вместо своего ErrorData класса? Это кажется лучше, чем наследование или состав.

Похоже, getSystemError должен быть свободной функцией пространства имен вместо члена (похоже, все, что ему нужно, передается в его параметры).

...