Obsluga wyjatkow w grach w C++


Warsztat - Programowanie gier komputerowych :: Obsluga wyjatkow w grach w C++







Strona główna Forum Szukaj Lista użytkowników
Grupy
Zarejestruj Zaloguj

Artykuły
Kliknij na kategorię żeby dodać artykuł Szukaj
Programowanie gier » Artykuły » Ogólnie o programowaniu
[Wersja do drukowania]
Obsluga wyjatkow w grach w C++
Opis Autor przedstawia sposob w jaki mozna sobie
poradzic z bledami w swoich programach.
Autor ayufan Data Sro 06 Paź, 2004 12:48 am Typ ***
Słowa klucze
Kategoria Ogólnie o programowaniu
Odsłony 456


Obsluga wyjatkow w grach w C++
Autor przedstawia sposob w jaki mozna sobie poradzic z
bledami w swoich programach.

Obsluga wyjatków w grach

Pewnie wszyscy z Was grali w Unreal. Pewnie wszystkim z
Was sie on wykrzaczyl. Wtedy pokazuje sie okienko, które
informuje o dokladnym polozeniu bledu w stosie wywolan,
a gra po sobie sprzata. Jak osiagnac powyzszy efekt?

1. Próbuj-rzuc-wychwyc

Kluczem do tego jest obsluga wyjatków w C++
Odbywa sie ona przy pomocy bloków try - catch. Moga one
byc zagniezdzone na dowolna glebokosc, ich zagniezdzenie
jest dynamiczne, czyli obejmuje równiez wywolania
funkcji. W przypadku zgloszenia wyjatku throw opuszczane
sa wszystkie bloki try az do napotkania catch
wychwytujacego konkretny typ wyjatku.

Poniewaz try-catch jest cecha specyficzna C++, to
obsluguje klasy, w tym destruktory. Tak wiec mamy
pewnosc, ze przy opuszczaniu bloku, tak jak przy
opuszczaniu funkcji w normalny sposób, wszystkie obiekty
zostana zwolnione.

2. Jak to ugryzc?

Czas zajac sie implementacja tego systemu w grze.
Po pierwsze, konieczna jest funkcja zamykajaca
urzadzenia i likwidujaca okno gry. Potrzebny jest tez
obiekt, który w swoim destruktorze te funkcje wywoluje.

Dla uproszczenia przyjme, ze dysponujemy tylko jednym
typem wyjatku - krytycznym, tzn. takim, przy którym
program konczy dzialanie.

W celu utworzenia stosownego systemu w funkcji glównej
(np. WinMain) umieszczamy na poczatku linie

try {
wewnatrz bloku try-catch obiekt, którego destruktor
zamknie srodowisko gry, na koncu zas
} catch(...) { KomunikatBledu }
KomunikatBledu to funkcja podajaca odpowiedni komunikat.
Zazwyczaj jej dzialanie polega na wyswietleniu nazwy
bledu i ewentualnie stosu wywolan.
W kazdej innej funkcji zas nalezy umiescic na poczatku
try {, a na koncu, w zaleznosci od tego, co chcemy
osiagnac, albo po prostu klamre, albo procedure
namierzajaca blad. W przypadku umieszczenia procedury
namierzajacej trzeba skorzystac z instrukcji throw bez
parametru. Jest to jedyny przypadek, w ktorym ta
instrukcja moze nie otrzymac parametrów.

Zazwyczaj lepiej blad namierzyc, jako, ze nie jest to
kosztowne (wywoluje sie tylko raz - przy bledzie).
W tym wypadku wyglada to mniej wiecej tak:


Funkcja()
{
try {

// tu jest cialo funkcji

} catch(...) // wylapuj wszystkie bledy
{
Wyjatki::DopiszNamiar("Komunikat"};
throw; // przekaz wyjatek dalej
}
}


Wyjatkiem jest nazwa namespace, w której znajduja sie
funkcje komunikatów o bledach.
Komunikat to najczesciej nazwa funkcji.

DopiszNamiar ma najczesciej taka postac:


strcat(CalyKomunikat,NowyKomunikat);



Wywolanie wyjatku nastepuje poprzez instrukcje throw z
dowolnym parametrem.

3. Makra

Pozostaje juz tylko kwestia usprawnienia tego systemu
poprzez makra.
Najprosciej mozna to zrobic tak:


#define _TRY try {
#define _CATCH(x) } catch(...) {
Wyjatki::DopiszNamiar(x); throw; }



Nie polecam uzywania nazw makr TRY i CATCH, gdyz uzywa
ich MFC.

4. Podsumowanie

Ten system nie chroni przed bledami; raczej pozwala je
dokladnie wykryc, co jest bardzo istotne w procesie
programowania. Stosowanie tego typu rozwiazania w fazie
testów jest bardzo korzystne ze wzgledu na mozliwosc
namierzenia bledu bez korzystania z debugera, czyli przy
zoptymalizowanym kodzie.

http://warsztat.pac.pl/artykuly/except/USingle.h
http://warsztat.pac.pl/artykuly/except/UExceptions.cpp
http://warsztat.pac.pl/artykuly/except/UExceptions.h

Michal Zientkiewicz aka Mike


Skocz do: Wybierz forumWarsztat - Programowanie
gier komputerowych|--Szkółka| |--Szkółka -
języki| |--Szkółka - grafika| |--Szkółka -
inne|--Programowanie gier| |--Ogólnie|
|--Dźwięk| |--Sztuczna Inteligencja|
|--Inne|--Programowanie grafiki|
|--Programowanie grafiki| |--OpenGL|
|--DirectX|--Produkcja| |--Pomysły|
|--Projektowanie| |--Projekty| |--Grafika|
|--Ogłoszenia|--O czym innym| |--Konferencje,
spotkania| |--Warsztat| |--Aktualności|
|--Artykuły| |--Wykłady| |--Compo|
|--Lepperlandia|--Śmietnik| |--Z odrzutu



Powered by Knowledge Base, wGEric (C) 2002 PHPBB.com MOD
This script (Knowledge Base - MX Addon v. 1.03e) is modified
by Haplo





W1.5b (C) 2004
[admin: ayufan, g[R]eK, Goliatus, mikael_, Regedit]
Wszystkie czasy w strefie CET (Europa)

Powered by phpBB2 Plus 1.52 based on phpBB 2.0.10 © 2001, 2002 phpBB
Group :: FI Theme :: Mody i Podziękowania












Wyszukiwarka