Mechanizm pseudo-wyjątków
DarkGL
25.12.2012
http://pl.wikibooks....bsługa_wyjątków
The try, catch, and throw Statements (C++)
PHP: Exceptions - Manual
Wyjątek – Wikipedia, wolna encyklopedia
Wyjątek (ang. exception) jest mechanizmem przepływu sterowania używanym w mikroprocesorach oraz współczesnych językach programowania do obsługi zdarzeń wyjątkowych, a w szczególności błędów, których wystąpienie zmienia prawidłowy przebieg wykonywania programu. W momencie zajścia niespodziewanego zdarzenia generowany jest wyjątek, który musi zostać obsłużony poprzez zapamiętanie bieżącego stanu programu i przejście do procedury jego obsługi. W niektórych sytuacjach po obsłużeniu wyjątku można powrócić do wykonywania przerwanego kodu, korzystając z zapamiętanych informacji stanu. Przykładowo obsługa błędu braku strony pamięci polega najczęściej na pobraniu brakującej strony z pliku wymiany, co umożliwia kontynuowanie pracy programu, natomiast błąd dzielenia przez zero powoduje, że wykonywanie dalszych obliczeń nie ma sensu i musi zostać przerwane na trwałe.
Implementacja w pawn ma pewne ograniczenia ( stąd pseudo ) wynikające z sposobu jakie są one zaimplementowane.
Nie ma np. wyłapywania nie obsłużonych wyjątków wynika to z tego że implementacja takiego mechanizmu wymagała by użycia np. tasków a takie rozwiązanie było by bardzo podatne na błędy i samo w sobie potrafiło by generować sytuacje wyjątkowe .
Radził bym to traktować jaką pewnego rodzaju ciekawostkę ale nic nie stoi na przeszkodzie w używaniu tego w pluginach jednak lepiej przyswoić sobie wiedzę o wyjątkach z źródeł podanych na początku.
http://darkgl.amxx.p...yjatkow-w-pawn/
Download pliku inc na dole postu
Przykłady użycia :
Test1
Test2: można zagnieżdżać wyjątki
Test3: można łapać kilka wyjątkow na raz
i tutaj wychodzi pierwsze ograniczenie jeśli obie funkcje zgłoszą wyjątki to zostanie obsłużony tylko pierwszy czyli TestExcept2 , TestExcept zostanie w pamięci więc jeśli mamy taką sytuację powinniśmy wyczyścić pamieć z tych wyjątków w taki sposób.
poprawna implementacja
lub
jeżeli dwie funkcje zgłaszają ten sam wyjątek też warto to dodać
Kolejne ograniczenie to wywoływanie funkcji catch teoretycznie jeśli funkcja zgłosi wyjątek program powinien przejść od razu do bloku catch jednak nie tutaj. W naszym przypadku catch zostanie uruchomione dopiero gdy wszystkie funkcje w bloku try zostaną wykonane.
Przykład
funkcja testFunction() zgłosi wyjątek mimo to testFuncion2() się wykona dopiero wtedy catch złapie wyjątek
Download
exceptions.inc 3,17 KB 57 Ilość pobrań
Fili:P
26.12.2012
DarkGL
26.12.2012
#include <amxmodx> #include <amxmisc> #include <exceptions.inc> #define PLUGIN "New Plugin" #define AUTHOR "DarkGL" #define VERSION "1.0" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) try(){ readConfig(); } catch("InputError"){ log_amx( "Couldn't load config" ); //stworz config etc. } } public readConfig(){ new szFile[ 256 ]; formatex( szFile[ get_configsdir( szFile , charsmax( szFile ) ) ] , charsmax( szFile ) - strlen( szFile ) , "/config.cfg" ); new pFile = fopen( szFile , "rt" ); if( !pFile ){ raise("InputError","InputError Message"); } //jakies operacje fclose( pFile ); }
gdyby funkcja fopen już bezpośrednio zwracał wyjątek wtedy warunek if nie był by już potrzebny i kod jeszcze bardziej się upraszcza
Użytkownik DarkGL edytował ten post 26.12.2012 16:08
dasiek
01.01.2013
jak sensu nie widzisz używania tego to nie używajJest sens używania tego ?
Fili:P
01.01.2013
1. Odpowiadając, wypowiadając się nie wolno przeklinać, obrażać.jak sensu nie widzisz używania tego to nie używaj i męcz się używając 9215 ifów.Jest sens używania tego ?
2. Jeżeli nie masz nic sensownego do dodania to nie pisz w ogóle bo może to się dla Ciebie źle skończyć. ( zupełnie bezsensowna wypowiedzieć, próba użycia ironii - zupełna błazenada, mi chodziło pisząc ten post o sens użycia tego, a nie wypowiedź jak to czasem mówią nauczyciele "chłopczyka z zerówki" )
3. W każdym miejscu forum obowiązuje zakaz zamieszczania treści, o których autor wie, że są nieprawdziwe i/lub zniesławiające, obraźliwe, wulgarne, nienawistne, obsceniczne, bluźniercze, pornograficzne, naruszające prywatność lub inne treści niezgodne z prawem.
4. Przestrzegaj zasad Netykiety.
To wyżej z regulaminu, mam nadzieję że czytałeś...
To niżej ode mnie:
1. Ostatnio zauważyłem, że jakoś często przyczepiasz się do moich postów i próbujesz zrobić ze mnie idiotę swoimi wypowiedziami. To że nic ci się nie podoba nie znaczy, że musisz wypowiadać się tonem jakbyś był "lepszy", "z wyższej półki", bo masz zielony kolor.
2. Dodanie w tytule "Głupieje - Przepraszam." nie zwalnia cie z przestrzegania regulaminu i pisania w tak chamski sposób.
3. Forum jest z tego co powiem do pomocy głownie w sprawach Pawn, więc może jako moderator zacząłbyś dawać przykład zamiast robić z siebie "wielmożnego" krytyka.
4. Jeżeli miałeś zły dzień, to nie usprawiedliwia cie to, idź wyżej się w inny sposób.
5. Zadałem proste pytanie oczekując odpowiedzi tak/nie + jeżeli ktoś by był tak miły jakiegoś przykładu, a nie "tego".
6. "Jak sensu nie widzisz, nie używaj" - jako moderator wnioskuję że masz jakiś poziom IQ, więc mogłeś wywnioskować, iż chciałbym tego użyć, lecz mam pewne wątpliwości, które dzięki temu postowi chciałem rozwiać. Dzięki tobie użyję, ale gdy ktoś spyta dlaczego, to powiem że CheQ mnie wyśmiał, bo zadałem pytanie...
7. Hmm... Mógłbyś również stwierdzić że mój post był głupi, czy coś w tym stylu, ale przecież moderator powinien niszczyć spory zamiast je tworzyć, budować zamiast burzyć, dawać dobry przykład zamiast złego, pokazać że nie bez powodu tu jest.
8. Ostatnim czasem według mnie "schodzisz na psy", oczywiście nie chcę cię w ten sposób urazić i jeżeli to zrobiłem to przepraszam...
Ode mnie minus.
Co do tematu, aby nie było offtopu.
Uzupełniając moje pytanie, aby nie natrafić znów na tak głupie wypowiedzi. Wyjaśnię coś. Jedyny kod, który "ogarnąłem" to ten od Darka w 3 poście tematu i właśnie na nim wzorowałem się pisząc to pytanie, bo jeżeli dał:
if( !pFile ){
raise("InputError","InputError Message");
}
To można też dać:
if( !pFile ){
log_amx( "Couldn't load config" );
}
I wyjdzie na to samo, nie używając wątków, dlatego mnie zastanawia w jakim celu tego użyć, być może w innym przykładzie byłoby to lepiej zilustrowane, dlatego proszę o zobrazowanie takowego przykładu.
Pozdrawiam.
Gość_21977_* 01.01.2013
Ad. 2. tak, tu się zgodzę, CheQ odpowiedział nie na temat, a Fili:P nie powinien był zadawać pytania w tym temacie, bo problem dotyczy zagadnienia, a nie konkretnej implementacji.
Ad. 3. & Ad. 4. czyt. Ad. 1.
btw. Naprawdę, ja wiem, że się nie lubicie, ale przestańcie, proszę.
Jak się jeszcze kłótnia CheQ vs Fili:P rozwinie, to wątek tematu zostanie przeniesiony do Off-topu.
DarkGL
01.01.2013
kod który podałeś czyli log_amx to nie to samo co wyjątki
żeby zobaczyć sens używania tego trzeba mieć pewne doświadczenie w projektowaniu dużych aplikacji , stron etc.
Jak się nazwać
01.01.2013
#include <amxmodx> #include <amxmisc> #define PLUGIN "New Plugin" #define AUTHOR "DarkGL" #define VERSION "1.0" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) new szFile[ 256 ]; formatex( szFile[ get_configsdir( szFile , charsmax( szFile ) ) ] , charsmax( szFile ) - strlen( szFile ) , "/config.cfg" ); new pFile = fopen( szFile , "rt" ); if( !pFile ){ //stworz config etc. } fclose( pFile ); }
DarkGL
01.01.2013
Użytkownik DarkGL edytował ten post 01.01.2013 22:46