GMS 2.3 - try-catch - łapanie wyjątków

Czwartek, 19 Grudnia 2019, 14:03
Czas czytania 2 minuty, 24 sekundy
Zgodne z GM: gms2
Nowy mechanizm w GMS 2.3, którego brakowało nam wszystkim.
GMS 2.3 pozwoli na łapanie wyjątków (błędów w kodzie) co pozwoli na dalsze działanie naszej gry bez zawieszenia/wyłączenia.

Ot, chociażby kod:
kodvar a = 5 / 0;Normalnie zwraca błąd "Cannot divide by zero". Każdy bowiem wie, że przez zero dzielić się nie da. Gra pokaże ekran błędu z przyciskiem OK i zakończy działanie.

W GMS 2.3 można to jednak obejść:
kodtry {
<statement1>;
<statement2>;
etc...
}
catch(<variable>) {
<statement1>;
<statement2>;
etc...
}
gdzie <variable> to nazwa zmiennej, do jakiej trafi struktura z właściwościami błędu:
kod
<variable> = {
message: "<text>",
longMessage: "<text>",
script: "<text>",
stacktrace: ["<text>", "<text>", ...]
};
Przykładowo, można pominąć wyskakiwanie okienka z błędem i zamiast tego wyświetlić błąd w konsoli (albo po zmianie kodu zapisywać/wysyłać).
kodvar a = 0, b = 0, c = 0;
try
{
c = a div b;
}
catch( _exception)
{
show_debug_message(_exception.message);
show_debug_message(_exception.longMessage);
show_debug_message(_exception.script);
show_debug_message(_exception.stacktrace);
}

Można też skorzystać z instrukcji finally, aby wykonać kod bez wzgledu na to, czy wyjątek wystąpi czy nie, poprzedzając nią nasz blok kodu:
kodfinally {
<statement1>;
<statement2>;
etc...
}
Wskazówka:
Można używać dowolnych kombinacji try+finally, try+catch lub try+catch+finally, ale w takich blokach nie można używać break, continue, exit czy return, gdyż gra się nie skompiluje.
kodvar a = 0, b = 0, c = 0;
try
{
try
{
c = a div b;
}
finally
{
++a;
}
}
catch(_exception)
{
++a;
show_debug_message(_exception.message);
show_debug_message(_exception.longMessage);
show_debug_message(_exception.script);
show_debug_message(_exception.stacktrace);
}
finally
{
show_debug_message("a = " + string(a));
}

Można też użyć funkcji, która złapie wszystkie niezłapane wyjątki aby nie wyświetlać żadnych błędów (ale je logować/wysyłać).
Służy do tego exception_unhandled_handler(user_handler);.
kodexception_unhandled_handler(function(ex)
{
show_debug_message( "----------------------------------------------------------------------");
show_debug_message( "Unhandled exception " + string(ex) );
show_debug_message( "----------------------------------------------------------------------");
if file_exists("crash.txt") file_delete("crash.txt");
var _f = file_text_open_write("crash.txt");
file_text_write_string(_f, string(ex));
file_text_close(_f);
return 0;
}
)
W powyższym przykładzie zapisujemy ostatni błąd do pliku (ostatni - gdyż następuje kasowanie pliku gdy już istniał).
Wskazówka:
Użycie return spowoduje, że taki właśnie kod zostanie zwrócony na zakończenie pracy runnera. Nie jest to wymagany parametr
Komentarze (łącznie 0):
Nie ma jeszcze żadnego komentarza. Czas to zmienić

Najnowsze wersje GameMakera:

Stabilna
2023.8.1.102 • 2023.8.1.148
wydana 14 dni temu
LTS
2022.0.1.31 • 2022.0.1.30
wydana 169 dni temu
Beta
2023.800.0.406 • 2023.800.0.429
wydana 30 dni temu
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Adriann
(~ostatnie 15 minut)
Discord
43 użytkownicy online na discordzie:
ACCESS_ViOLATiON, HappyOrange, Draczeq, MKP, OdrzuconyKrakers, Alice, Nitro Slav, Carl-bot, PolTomski, Voytec, DungeonFairy, Wielki Druid, Murrri, Grela, Kowu, TobiasM (Morgo), fervi, Uzjel, Cysior, Alkapivo, lethian, Pako, Arrekin, LadyLush, Dominator2v, LeD, Domeen0, szmalu, Adriann, Fylyps, ZYGZAK, Ulti, bagno, Dyno, Mtax, 🧁Cupcake🧁, g..., Kandif, Danieo, Krzysiek1250, lakas, SzymonKe, Kuzyn
Shoutbox
art22pl (17:45, 29.09.23)
jest chyba jakiś problem z załączaniem zdjęć do postu
gnysek (14:59, 28.09.23)
Poszedł dziś update strony :)
Adriann (21:06, 14.08.23)
Jest..hoho:D
Adriann (21:04, 14.08.23)
Nie znam tego, poszukam. Nie mówisz mam nadzieję o tej podmiance wewnątrz skryptu?
gnysek (10:38, 14.08.23)
Przecież jest: Search & Replace. Do tego nazwy skryptów i zasobów akurat Feather podmienia praktycznie bez problemów.
Adriann (14:39, 12.08.23)
Przydałaby się opcja do globalnej zmiany nazwy zmiennejobiektu we wszystkich skryptach i obiektach :D Tak to jest dość ciężko zabrać się za sprzątanie
SimianVirus7 (10:39, 12.08.23)
To nie burdel, to nieład artystyczny
exp (00:35, 12.08.23)
Feather nie zrozumiał, że burdel jest elementarną częścią mojego projektu
exp (00:34, 12.08.23)
Miałem to samo, nie tyle otworzyłem stary projekt, co w końcu ściągnąłem aktualizację (bo olewałem ten komunikat od chyba półtora roku)
gnysek (23:48, 10.08.23)
Kolizje tilesetowe rządzą!
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Kiedy wyjdzie GameMaker (Studio) 3.0?