Gerenciamento de estado e tratamento de erros
Use lua_pcall para chamadas protegidas e trate erros na camada C.
Gerenciamento de estado e tratamento de erros é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
Vários estados Lua
Você pode executar várias instâncias de lua_State no mesmo processo. Cada uma é totalmente independente: possui globais e pilhas separadas e, por padrão, não compartilha memória.
Estados de threads
lua_newthread(L) cria uma thread filha (corrotina) que compartilha o mesmo ambiente global, mas tem sua própria pilha. É assim que as corrotinas Lua são implementadas em C.
Compartilhando dados entre estados
Os dados não podem ser passados diretamente entre estados Lua independentes. Serialize-os em strings ou use estruturas de memória compartilhada no lado C, acessíveis por meio de userdata.
Chamadas protegidas versus chamadas brutas
lua_pcall captura erros (usa setjmp/longjmp internamente). lua_call propaga os erros e encerra o programa. Sempre use lua_pcall em produção.
// Safe:
if (lua_pcall(L, nargs, nresults, 0) != LUA_OK) {
const char *err = lua_tostring(L, -1);
lua_pop(L, 1);
// handle error
}Objetos de erro
Os erros em Lua podem ser qualquer valor — não apenas strings. error({code=404, msg="not found"}) coloca uma tabela como erro. O código C a lê da pilha quando pcall falha.
Manipulador de pânico
Se um erro escapar de um pcall (por exemplo, de uma função C chamada sem proteção), Lua chama o manipulador de pânico definido por lua_atpanic(L, fn) antes de ser encerrado.
// C code
lua_atpanic(L, function(lua_State *L) {
fprintf(stderr, "PANIC: %s\n", lua_tostring(L, -1));
exit(1);
return 0;
});Restauração da pilha em caso de erro
Após um erro de lua_pcall, a pilha é restaurada ao estado anterior à chamada (sem a função e os argumentos, mas com o objeto de erro no topo).
Limpeza do estado
Sempre feche o estado com lua_close(L) quando terminar. Isso aciona todos os finalizadores __gc e libera toda a memória alocada.
Segurança de threads
Um estado Lua não é seguro para uso em threads. Nunca chame duas funções da API C no mesmo estado simultaneamente. Use um estado por thread do OS ou um mutex para serializar o acesso.
Alocador de memória
Por padrão, Lua usa realloc. Forneça um alocador personalizado com lua_newstate(allocFn, ud) para rastrear a memória, impor limites ou usar pools personalizados.
Sandbox com vários estados
Execute código não confiável em um estado Lua novo e isolado, sem bibliotecas padrão abertas. Qualquer falha ou esgotamento de recursos ficará contido nesse estado.
Pergunta sobre tratamento de erros
Qual é a diferença entre lua_call e lua_pcall?
Recapitulação: gerenciando estados e erros
Use lua_pcall (nunca lua_call) em produção. Defina um manipulador de pânico para recuperação em último caso. Mantenha um estado por thread. Use vários estados isolados para criar sandboxes. Sempre chame lua_close para fazer a limpeza.
Perguntas Frequentes
A aula “Gerenciamento de estado e tratamento de erros” é grátis?
Sim — o texto completo de “Gerenciamento de estado e tratamento de erros” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Gerenciamento de estado e tratamento de erros”?
Use lua_pcall para chamadas protegidas e trate erros na camada C. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Gerenciamento de estado e tratamento de erros”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Modelo de pilha da API C do Lua
- Chamando funções Lua a partir de C
- Registrando funções C no Lua
- Gerenciamento de estado e tratamento de erros