################################################################################
  Kodowanie Windows-1250, koniec wiersza CR+LF, test: Za gl ja
  Error - Klasy wyjtkw do obsugi bdw
  Copyleft (C) 2007 Adam Sawicki
  Licencja: GNU LGPL
  Kontakt: mailto:sawickiap@poczta.onet.pl , http://regedit.gamedev.pl/
################################################################################


Ten modu to propozycja ujednoliconego mechanizmu obsugi bdw w programie z
uyciem wyjtkw C++. Mona go uywa w swoim kodzie. Uywaj go te niektre
inne moduy CommonLib, m.in. Stream i Files.

Klas bazow wyjtku jest Error. Przechowuje ona stos stringw z komunikatami
bedw. Motywacj takiego podejcie znajdziesz w moim artykule: "Problemy z
obsug bdw w kodzie C++", Adam Sawicki, Grudzie 2005,
http://regedit.gamedev.pl/produkcje/artykuly/obsluga_bledow.php5 Piszc w
skrcie: obsuga bdw w programie jest niezwykle istotna dla efektywnego
znajdowania i poprawnia bdw w programie oraz identyfikowania i rozwizywania
problemw podczas jego uywania. Tymczasem ani komunikat bdu z miejsca jego
wystpienia - ten najniszego poziomu - na przykad "Nie mona skonwertowa
liczby na acuch", ani komunikat z miejsca jego odebrania - ten nawyszego
poziomu, na przykad "Nie mona uruchomi programu" - nie daje penej informacji
potrzebnej do zidentyfikowania problemu. Dopiero dokadanie na stos komunikatw
bdw w czasie "przelotu" wyjtku a potem ich zdjcie ze stosu w odwrotnej
kolejnoci daje peny obraz sytuacji, na przykad:

  Nie mona uruchomi programu
  Nie mona wczyta pliku: Config.dat
  Bd skadni. Wiersz: 23, Kolumna: 8, Znak: 56
  Nie mona skonwertowa liczby na acuch

Dostpne s makra do otaczania treci funkcji, aby wygodniej apa bdy,
dopisywa nowy komunikat do stosu i rzuca je dalej.


Klasy wyjtkw
================================================================================

Klasa Error nie jest polimorficzna. Jedynym sensem istnienia jej klas pochodnych
jest obecno konstruktora, ktry inicjalizuje bd komunikatem z danymi
charakterystycznymi dla danej biblioteki w razie potrzeby samemu pobierajc dane
tego bdu. Innymi sowy - zamienia bd danej biblioteki na ujednolicony
mechanizm obsugi bdw oferowany przez modu Error. Dostpne s klasy:

- Error - bd wasny uytkownika
  Klasa bazowa wyjtku

- ErrnoError - bdy biblioteki standardowej C i Linux API
  Pobiera kod i komunikat bdu ze zmiennej errno.
- Win32Error - bedy Windows API
  Pobiera kod i komunikat bdu z funkcji GetLastError.
  (Tylko w Windows)

- SDLError - bedy biblioteki SDL
  (Tylko jeli zdefiniujesz makro USE_SDL)
- OpenGLError - bdy biblioteki OpenGL
  (Tylko jeli zdefiniujesz makro USE_OPENGL)
- FmodError - bdy biblioteki FMOD
  (Tylko jeli zdefiniujesz makro USE_FMOD)
- DirectXError - bdy biblioteki DirectX
  (Tylko jeli zdefiniujesz makro USE_DIRECTX)
- WinSockError - bdy biblioteki WinSock (cz Windows API)
  (Tylko jeli zdefiniujesz makro USE_WINSOCK)
- DevILError - bdy biblioteki DevIL do obsugi obrazkw
  (Tylko jeli zdefiniujesz makro USE_DEVIL)
- AVIFileError - bdy biblioteki AVI File (cz Windows API)
  (Tylko jeli zdefiniujesz makro USE_AVI_FILE)


Przykad
================================================================================

void RobCos()
{
	ERR_TRY;

	throw common::Error("Jaki bd");

	ERR_CATCH_FUNC;
}

void WczytajKonfiguracje(const string &NazwaPliku)
{
	ERR_TRY;

	RobCos();

	ERR_CATCH("Nie mona wczyta pliku: " + NazwaPliku);
}

void UruchomProgram()
{
	ERR_TRY;

	WczytajKonfiguracje("Config.dat");

	ERR_CATCH("Nie mona uruchomi programu");
}

void Test()
{
	try
	{
		UruchomProgram();
	}
	catch (const common::Error &e)
	{
		string Message;
		e.GetMessage_(&Message);
		MessageBox(g_MainWnd, Message.c_str(), "Mj program", MB_OK | MB_ICONERROR);
	}
}

Przykad ten zwrci komunikat bdu podobny do tego:

[test.cpp,1611] Nie mona uruchomi programu
[test.cpp,1602] Nie mona wczyta pliku: Config.dat
[test.cpp,1593] void __cdecl RobCos(void)
Jaki bd
