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
2024.2.0.132 • 2024.2.0.163
wydana 45 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 184 dni temu
Beta
2024.400.0.543 • 2024.400.0.562
wydana  wczoraj
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
12 użytkownicy online na discordzie:
s..., DungeonFairy🧚, Carl-bot, GibkiKaktus, Kowu, antek, Dyno, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, LeD, bagno, l..., TobiasM (Morgo)
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?