Chamadas Protegidas com pcall()
Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 33 de 54.
Enquanto error() interrompe seu programa quando algo dá errado, às vezes você quer lidar com erros sem que ele trave. A função pcall() do Lua permite que você execute código que pode falhar de forma segura.
O nome pcall() significa "chamada protegida" (protected call). Ele envolve uma chamada de função em uma camada protetora que captura quaisquer erros. Em vez de seu programa travar, o pcall() retorna informações sobre o que aconteceu.
Aqui está a sintaxe básica:
local status, result = pcall(functionName, arg1, arg2)A função pcall() retorna dois valores. O primeiro é um status booleano: true se a função foi bem-sucedida, ou false se ocorreu um erro. O segundo valor depende do status — se for bem-sucedido, é o valor de retorno da função; se houve um erro, é a mensagem de erro.
Aqui está um exemplo prático:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
endNeste exemplo, a divisão por zero dispara um erro, mas em vez de travar, o pcall() o captura. O programa continua em execução e pode lidar com o erro de forma elegante verificando o valor de status.
Desafio
FácilEscreva uma função safeCalculate que receba operation, a e b e retorne o resultado do cálculo ou uma mensagem de erro.
A função deve usar pcall() para realizar a operação matemática solicitada de forma segura. Crie uma função interna que realize o cálculo com base na string da operação e, em seguida, envolva-a com pcall() para capturar quaisquer erros.
Lógica:
- Crie uma função interna que verifique o tipo de operação e realize o cálculo
- Para "add", retorne
a + b - Para "subtract", retorne
a - b - Para "multiply", retorne
a * b - Para "divide", verifique se
bé 0 e chameerror("Division by zero")se for verdade, caso contrário, retornea / b - Para qualquer outra operação, chame
error("Invalid operation") - Use
pcall()para executar a função interna - Se for bem-sucedido, retorne
"Result: "seguido pelo resultado - Se ocorrer um erro, retorne
"Error: "seguido pela mensagem de erro
Parâmetros:
operation(string): A operação a ser realizada ("add", "subtract", "multiply" ou "divide")a(número): O primeiro operandob(número): O segundo operando
Retorna: Uma string contendo "Result: " seguido pelo resultado do cálculo, ou "Error: " seguido pela mensagem de erro (string)
Folha de consulta
A função pcall() (protected call) permite que você execute código que pode falhar com segurança, sem travar o seu programa.
Sintaxe básica:
local status, result = pcall(functionName, arg1, arg2)pcall() retorna dois valores:
- status:
truese a função for bem-sucedida,falsese ocorrer um erro - result: O valor de retorno da função se for bem-sucedida, ou a mensagem de erro se ocorrer um erro
Exemplo:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
endIsso captura o erro em vez de travar, permitindo que o programa continue e trate o erro de forma adequada.
Experimente você mesmo
function safeCalculate(operation, a, b)
-- Escreva o código aqui
end
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Iteração Avançada de Tabelas
Iterando com pairs()Iterando com ipairs()pairs() vs. ipairs()Revisão - Ficha de Personagem2Mais Funções da Biblioteca Table
table.concat()Construção de tabelas e unpack()table.sort()Ordenação personalizada com funçõesRecapitulação - Placar de recordes