forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Обработка ошибок, логи и не только. (http://forum.boolean.name/showthread.php?t=11669)

HolyDel 06.01.2010 15:26

Обработка ошибок, логи и не только.
 
Доброго времени суток, товарищи!

Думаю писть логи в html формате. Возникла следующая идея - чтобы ошибка в логе имела ссылку на оффсайт движка в раздел справки с описанием этой ошибки и действий, которые необходимо принять чтобы ее устранить. Какая то такая например: "<a href = http://sigle.com/help/error.php?err="InitError">Init Error!</a>" может быть в логах. Чем это удобно - открываем логи, видим ошибку в виде ссылки, если не знаем что делать - щелкаем на нее и RTFM.
Так вот, развивая идею я пришел в выводу что было бы довольно удобно сделать вывод в логи ошибок в момент возникновения исключения. Т.е. в описываем исключении будут методы для вывода имени ошибки (what()) и вывод решения (ссылка на сайт), чтобы сформировать строчку в лог-файле. Но тут возникли некоторые неприятные моменты.

Код:

#include <iostream>

using namespace std;

class Error
{
    protected:
    void Log()
    {
        cout<<GetErrorName()<<" : "<<GetSolutionName()<<endl;
    }
    virtual const char * GetErrorName() = 0;
    virtual const char * GetSolutionName() = 0;
    public:
    //Base() {Log();};
};

class BeerIsOver : public Error
{
    protected:
    const char * GetErrorName() {return "You beer is over";};
    const char * GetSolutionName() {return "bye";};
    public:
    BeerIsOver() {Log();};
};

class LightIsRed : public Error
{
    protected:
    const char * GetErrorName() {return "Lamp is red!";};
    const char * GetSolutionName() {return "don't see";};
    public:
    LightIsRed() {Log();};
};

int main()
{

    try
    {
    throw BeerIsOver();
    }
    catch(...)
    {
    }

    try
    {
    throw LightIsRed();
    }
    catch(...)
    {
    }

    cout << "Ok..." << endl;
    return 0;
}

1. Не охота писать конструктор в производных классах (он один фиг какой то шаблонный). Нельзя ли что нибудь придумать, чтобы обойтись без этого?

ISergey 06.01.2010 16:32

Ответ: Обработка ошибок, логи и не только.
 
Цитата:

1. Не охота писать конструктор в производных классах
Код:

#include <iostream>

using namespace std;

class Error
{
public:
        virtual ~Error() {}
        void Log() {
                cout<< GetErrorName() << " : " <<GetSolutionName() << endl;
        }
        virtual const char * GetErrorName() = 0;
        virtual const char * GetSolutionName() = 0;
};

class BeerIsOver : public Error
{
public:
        const char * GetErrorName()    { return "You beer is over";}
        const char * GetSolutionName() { return "bye";}
};

class LightIsRed : public Error
{
public:
        const char * GetErrorName()    { return "Lamp is red!";}
        const char * GetSolutionName() { return "don't see";}
};

int main()
{

        try
        {
                throw BeerIsOver();
        }
        catch(Error &r)
        {
                r.Log();
        }

        try
        {
                throw LightIsRed();
        }
        catch(Error &r)
        {
                r.Log();
        }

        cout << "Ok..." << endl;
        return 0;
}


HolyDel 06.01.2010 16:47

Ответ: Обработка ошибок, логи и не только.
 
не вариант.
так я буду нагружать конечного пользователя лишней писаниной.

ISergey 06.01.2010 17:20

Ответ: Обработка ошибок, логи и не только.
 
Ну тогда так...
Код:

#include <iostream>

using namespace std;

class Error;

template <typename T>
class IError{
public:
        IError(){
                Error *err = new T;
                err->Log();
                delete err;
        }
};

class Error
{
public:
        virtual ~Error() {  }
        void Log() { cout<< GetErrorName() << " : " <<GetSolutionName() << endl; }

        virtual const char * GetErrorName()                = 0;
        virtual const char * GetSolutionName()  = 0;       
};

class BeerIsOver : public Error
{
public:
        const char * GetErrorName()    { return "You beer is over";}
        const char * GetSolutionName() { return "bye";}
};

class LightIsRed : public Error
{
public:
        const char * GetErrorName()    { return "Lamp is red!";}
        const char * GetSolutionName() { return "don't see";}
};


int main()
{

        try
        {
                throw IError<BeerIsOver>();
        }
        catch(...)
        {
        }

        try
        {
                throw  IError<LightIsRed>();
        }
        catch(...)
        {
        }

        cout << "Ok..." << endl;
        return 0;
}

Можно и так дописать
Код:

.......
typedef IError<LightIsRed> ILightIsRed;

int main()
{
        try
        {
                throw  ILightIsRed();
        }
        catch(...)
        {
        }

        return 0;
}


HolyDel 06.01.2010 19:05

Ответ: Обработка ошибок, логи и не только.
 
ISergey, во! Это отличный вариант, спасибо!


Часовой пояс GMT +4, время: 21:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot