Menu
CoddyTech

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 ele 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 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)
end

Neste exemplo, a divisão por zero desencadeia 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.

challenge icon

Desafio

Fácil

Escreva uma função safeCalculate que aceite 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 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 chame error("Division by zero", 0) se for verdadeiro; caso contrário, retorne a / b
  • Para qualquer outra operação, chame error("Invalid operation", 0)
  • Use pcall() para executar a função interna
  • Se for bem-sucedido, retorne "Result: " seguido do resultado
  • Se ocorrer um erro, retorne "Error: " seguido da mensagem de erro

Passe 0 como o segundo argumento de error(). Esse argumento é o nível do erro, e 0 informa ao Lua para não colocar o nome do arquivo e o número da linha antes da sua mensagem, portanto a string retornada é exatamente "Error: Division by zero".

Parâmetros:

  • operation (string): A operação a ser realizada ("add", "subtract", "multiply" ou "divide")
  • a (number): O primeiro operando
  • b (number): O segundo operando

Retorno: Uma string contendo "Result: " seguida do resultado do cálculo, ou "Error: " seguida da mensagem de erro (string)

Experimente você mesmo

function safeCalculate(operation, a, b)
    -- Escreva o código aqui
    -- Note: chame error(message, 0) para que o Lua não adicione o nome do arquivo e o
    -- número da linha na frente da sua mensagem.
end
quiz iconTeste seus conhecimentos

Esta 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

Pratique por conta própria: Compilador de Lua online