Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Mechanizm pseudo-wyjątków

wyjątki excepts raise try throw catch except

  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

#1 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 25.12.2012 20:57

*
Popularny

Wyjątki są zaimplementowane w wielu językach programowania np.

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
Spoiler


Test2: można zagnieżdżać wyjątki
Spoiler


Test3: można łapać kilka wyjątkow na raz
Spoiler


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
Spoiler


lub

Spoiler


jeżeli dwie funkcje zgłaszają ten sam wyjątek też warto to dodać ;)

Spoiler


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
Spoiler


funkcja testFunction() zgłosi wyjątek mimo to testFuncion2() się wykona dopiero wtedy catch złapie wyjątek

Download

Załączony plik  exceptions.inc   3,17 KB  56 Ilość pobrań

  • +
  • -
  • 7

#2 Fili:P

    Godlike

  • Power User

Reputacja: 754
Guru

  • Postów:1 679
  • Imię:Darek
  • Lokalizacja:Warszawa
Offline

Napisano 26.12.2012 13:45

No fajnie fajnie, a mógłbyś dać przykład jakiegoś użycia w pluginie, ale nie jak wyżej tylko dobrze ilustrujący ;) ?
  • +
  • -
  • 0

#3 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 26.12.2012 15:41

Hmm może tak
#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

  • +
  • -
  • 1

#4 Fili:P

    Godlike

  • Power User

Reputacja: 754
Guru

  • Postów:1 679
  • Imię:Darek
  • Lokalizacja:Warszawa
Offline

Napisano 01.01.2013 17:56

Jest sens używania tego ?
  • +
  • -
  • 0

#5 dasiek

    Nie wiem, nie znam się, nie orientuję się, zarobiony jestem.

  • Junior Admin

Reputacja: 2 077
Godlike

  • Postów:5 706
  • Imię:Adaś
  • Lokalizacja:No teraz trochę dalej od WWy
Online

Napisano 01.01.2013 19:36

Jest sens używania tego ?

jak sensu nie widzisz używania tego to nie używaj :facepalm:
  • +
  • -
  • 0

#6 Fili:P

    Godlike

  • Power User

Reputacja: 754
Guru

  • Postów:1 679
  • Imię:Darek
  • Lokalizacja:Warszawa
Offline

Napisano 01.01.2013 20:20

Jest sens używania tego ?

jak sensu nie widzisz używania tego to nie używaj i męcz się używając 9215 ifów.

1. Odpowiadając, wypowiadając się nie wolno przeklinać, obrażać.
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.
dasiek (01.01.2013 21:05):
Pozwól że odpowiem na Twoje argumenty tu.
1)Tak - przyczepiam, ale tylko postów w których chcesz pokazać nie wiadomo co. Od jakiegoś czasu próbujesz zrobić z siebie pr0gramiste jakbyś nie wiadomo ile umiał. Może umiesz - pokaż to w inny sposób.
2)Chamskie? To jeszcze nie było chamskie. Napisałbym i tu ale nie chce sie powtarzać. Patrz punkt 1.
3) Wielmożny krytyk powiadasz? Napisałeś "Czy jest sens używania tego?" tak jakbyś nie szanował pracę innych ludzi (pomysł + wykonanie jest pracą i czy to robi Dark czy benio czy ktoś kto dopiero się na forum zarejestrował powinna być szanowaną pracą) i to Ty mi mówisz ze robię z Siebie wielmoznego krytyka? Patrz punkt 1.
4)Jak będe miał zły dzień to się wyzeje na pewno nie na forum - na forum jestem modem - wyżywanie się w sposób o który mnie 'oskarżasz' nie jest godnym zachowaniem Dla moda.
5) Lepszego przykładu nie ma związanego z wyjątkami jak pliki.
6) Ironia niestety Ci się nie udała.
7) Bardzo ładne porównanie z budowaniem i burzeniem (metaforycznie) komentarz zostawie dla Siebie.
8) Ok niech będzie że schodzę - od miesięcy nic w Pawnie nie wyklikałem jeśli o to chodzi. Jeśli chodzi o moje zachowanie to jest prosta zasada = głupie Pytanie = głupia odpowiedź, oczywiście tu nikogo nie urażając - dostałeś kilka kodów - dark rzucił Teorię - i naprawdę nic?

Być może a nawet na pewno mój post nie powinien tak zabrzmieć - na pewno nie chciałem Cię nim urazić (ewentualnie 'lekko zasugerować' błędny post) Być może nie zrozumiałem. Dziękuje - ode mnie tyle.

  • +
  • -
  • 0

#7 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 01.01.2013 20:32

Ad. 1. nawet, jeśli Fili:P się obraził, to wypowiedź nie miała bezpośrednio takiego charakteru.
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.

#8 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 01.01.2013 20:43

Filip tak jak mówiłem poczytaj o tym mechanizmie w c++ czy w innych językach programowania
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.
  • +
  • -
  • 2

#9 Jak się nazwać

    Wszechmogący

  • Power User

Reputacja: 169
Profesjonalista

  • Postów:617
  • Imię:a
  • Lokalizacja:a
Offline

Napisano 01.01.2013 22:33

Mogę być w błędzie ale czym to się różni od tego:
#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 );

}

  • +
  • -
  • 0
Pisze na zamówienie statystyki pod nvault. GG: 15600964

#10 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 01.01.2013 22:46

:facepalm: Wykonuje to samo ale widać chyba czym się różni. Ogólnie w pewnym momencie samemu widać że taki mechanizm się przydaje ale trzeba mieć doświadczenie i pewne rozeznanie w temacie.

Użytkownik DarkGL edytował ten post 01.01.2013 22:46

  • +
  • -
  • 0

#11 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 23.03.2013 17:42

Mechanizm wyjątków przydaje się, i to bardzo ale... Raczej przy programowaniu obiektowym bądź opartym mocno o funkcje, które by te wyjątki zgłaszały. Po przerobieniu bibliotek AMX, aby z wyjątków korzystało, ma to sens... Przy używaniu tylko w ten sposób raczej prawie żaden...
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych