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