Chamadas protegidas com pcall()
Parte da seção Lógica e fluxo do Journey de Lua da Coddy. Lição 33 de 54.
Embora error() interrompa seu programa quando algo dá errado, às vezes você quer lidar com erros sem que o programa trave. 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 foi bem-sucedida, ou false se ocorreu um erro. O segundo valor depende do status: se a execução for bem-sucedida, será o valor de retorno da função; se houver um erro, será 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 tratar o erro de forma adequada verificando o valor de status.
Tenha em mente que pcall() captura todos os erros dentro da chamada, inclusive bugs que você não esperava, e os informa da mesma maneira. Portanto, envolva apenas a chamada que pode falhar e, para falhas esperadas, prefira uma função que retorne nil e uma mensagem, como na lição anterior.
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 executar com segurança a operação matemática solicitada. Crie uma função interna que faça 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 faça 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", 0)se for, caso contrário, retornea / b - Para qualquer outra operação, chame
error("Invalid operation", 0) - Use
pcall()para executar a função interna - Se a execução for bem-sucedida, retorne
"Result: "seguido do resultado - Se ocorrer um erro, retorne
"Error: "seguido da mensagem de erro
Passe 0 como segundo argumento de error(). Esse argumento é o nível do erro, e 0 diz ao Lua para não colocar o nome do arquivo e o número da linha antes da mensagem, para que a string retornada seja exatamente "Error: Division by zero".
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
-- Nota: chame error(message, 0) para que Lua não adicione o nome do arquivo e o
-- número da linha antes da sua mensagem.
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