Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 06.01.2010, 15:26   #1
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Обработка ошибок, логи и не только.

Доброго времени суток, товарищи!

Думаю писть логи в 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. Не охота писать конструктор в производных классах (он один фиг какой то шаблонный). Нельзя ли что нибудь придумать, чтобы обойтись без этого?
(Offline)
 
Ответить с цитированием
Старый 06.01.2010, 16:32   #2
ISergey
AnyKey`щик
 
Регистрация: 10.11.2008
Сообщений: 18
Написано 4 полезных сообщений
(для 5 пользователей)
Ответ: Обработка ошибок, логи и не только.

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;
}
__________________
Шутить надо так, чтобы потом не было мучительно больно за бесцельно выбитые зубы.
(Offline)
 
Ответить с цитированием
Старый 06.01.2010, 16:47   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Обработка ошибок, логи и не только.

не вариант.
так я буду нагружать конечного пользователя лишней писаниной.
(Offline)
 
Ответить с цитированием
Старый 06.01.2010, 17:20   #4
ISergey
AnyKey`щик
 
Регистрация: 10.11.2008
Сообщений: 18
Написано 4 полезных сообщений
(для 5 пользователей)
Ответ: Обработка ошибок, логи и не только.

Ну тогда так...
#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;
}
__________________
Шутить надо так, чтобы потом не было мучительно больно за бесцельно выбитые зубы.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (06.01.2010)
Старый 06.01.2010, 19:05   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Обработка ошибок, логи и не только.

ISergey, во! Это отличный вариант, спасибо!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com