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 tratar 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 "protected call" (chamada protegida). Ele envolve uma chamada de função em uma camada de proteção que captura quaisquer erros. Em vez do 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 teve sucesso, 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 sendo executado e pode lidar com o erro de forma adequada verificando o valor de status.
Desafio
FácilEscreva uma função safeCalculate que recebe operation, a e b e retorna o resultado do cálculo ou uma mensagem de erro.
A função deve usar pcall() para executar com segurança a operação matemática solicitada. Crie uma função interna que realize o cálculo com base na string de operação e, em seguida, envolva-a com pcall() para capturar quaisquer erros.
Lógica:
- Crie uma função interna que verifica o tipo de operação e realiza 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-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(number): O primeiro operandob(number): O segundo operando
Retorno: Uma string contendo "Result: " seguido pelo resultado do cálculo, ou "Error: " seguido pela 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çõesRecapitulação - Placar de recordes