Chamadas protegidas com pcall()
Parte da seção Lógica e Fluxo 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 causar uma falha. A função pcall() do Lua permite executar com segurança um código que pode falhar.
O nome pcall() significa “chamada protegida”. Ele envolve uma chamada de função em uma camada de proteção que captura quaisquer erros. Em vez de seu programa travar, 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 for executada com sucesso, ou false se ocorrer um erro. O segundo valor depende do status: se for bem-sucedida, é o valor retornado pela função; se houver 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, pcall() o captura. O programa continua em execução e pode lidar com o erro de forma adequada 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 com segurança a operação matemática solicitada. Crie uma função interna que execute 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 execute 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 verdadeiro; 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-sucedida, retorne
"Result: "seguido do resultado - Se ocorrer um erro, retorne
"Error: "seguido da mensagem de erro
Parâmetros:
operation(string): A operação a ser realizada ("add", "subtract", "multiply" ou "divide")a(number): O primeiro operandob(number): O segundo operando
Retorno: Uma string contendo "Result: " seguido do resultado do cálculo ou "Error: " seguido da mensagem de erro (string)
Experimente você mesmo
function safeCalculate(operation, a, b)
-- Escreva o código aqui
-- Note: O test runner espera que a mensagem de erro inclua o número da linha.
-- Garanta que sua chamada de erro esteja na linha esperada ou use uma mensagem de erro simples se o test runner permitir.
endEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
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çõesRevisão - Placar de pontuações máximasPratique por conta própria: Compilador de Lua online