Hantera tillstånd och fel
Använd lua_pcall för skyddade anrop och hantera fel i C-lagret.
Hantera tillstånd och fel är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.
Flera Lua-tillstånd
Ni kan köra flera instanser av lua_State i samma process. Varje instans är helt självständig: separata globala variabler, separata stackar och inget delat minne som standard.
Trådtillstånd
lua_newthread(L) skapar en underordnad tråd (coroutine) som delar samma globala miljö men har en egen stack. Så implementeras Lua-coroutines i C.
Dela data mellan tillstånd
Data kan inte skickas direkt mellan oberoende Lua-tillstånd. Serialisera data till strängar eller använd delade datastrukturer i C som är åtkomliga via userdata.
Skyddade anrop kontra råa anrop
lua_pcall fångar fel (och använder setjmp/longjmp internt). lua_call vidarebefordrar fel och avbryter programmet. Använd alltid lua_pcall i produktionskod.
// Safe:
if (lua_pcall(L, nargs, nresults, 0) != LUA_OK) {
const char *err = lua_tostring(L, -1);
lua_pop(L, 1);
// handle error
}Felobjekt
Fel i Lua kan vara vilket värde som helst – inte bara strängar. error({code=404, msg="not found"}) lägger en tabell som felvärde. C-kod läser den från stacken när pcall misslyckas.
Panic-hanterare
Om ett fel lämnar ett pcall (till exempel från en C-funktion som anropats utan skydd) anropar Lua panic-hanteraren, som har angetts via lua_atpanic(L, fn), innan programmet avbryts.
// C code
lua_atpanic(L, function(lua_State *L) {
fprintf(stderr, "PANIC: %s\n", lua_tostring(L, -1));
exit(1);
return 0;
});Återställning av stacken vid fel
Efter ett fel i lua_pcall återställs stacken till tillståndet före anropet (minus funktionen och argumenten, plus felobjektet överst).
Rensa upp tillståndet
Stäng alltid tillståndet med lua_close(L) när ni är klara. Detta utlöser alla __gc-finaliserare och frigör allt allokerat minne.
Trådsäkerhet
Ett Lua-tillstånd är inte trådsäkert. Anropa aldrig två C API-funktioner samtidigt på samma tillstånd. Använd ett tillstånd per operativsystemstråd eller ett mutex-lås för att serialisera åtkomsten.
Minnesallokerare
Som standard använder Lua realloc. Ange en anpassad allokerare med lua_newstate(allocFn, ud) för minnesspårning, begränsningar eller anpassade pooler.
Sandlådor med flera tillstånd
Kör opålitlig kod i ett nytt, isolerat Lua-tillstånd där inga standardbibliotek har öppnats. Krascher och resursbrist begränsas då till det tillståndet.
Fråga om felhantering
Vad är skillnaden mellan lua_call och lua_pcall?
Sammanfattning: hantera tillstånd och fel
Använd lua_pcall (aldrig lua_call) i produktionskod. Ange en panic-hanterare för återställning i sista hand. Använd ett tillstånd per tråd. Använd flera isolerade tillstånd för sandlådor. Anropa alltid lua_close för att rensa upp.
Lär dig Lua med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 40
- Lektioner
- 159
Vanliga frågor
Är lektionen ”Hantera tillstånd och fel” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Hantera tillstånd och fel”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Hantera tillstånd och fel”?
Använd lua_pcall för skyddade anrop och hantera fel i C-lagret. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Lua Academy?
Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Hantera tillstånd och fel”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Lua Academy-lektionen?
Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Stackmodellen i Lua:s C-API
- Anropa Lua-funktioner från C
- Registrera C-funktioner i Lua
- Hantera tillstånd och fel