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

Neste 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.

challenge icon

Desafio

Fácil

Escreva 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 chame error("Division by zero", 0) se for, 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 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 operando
  • b (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.
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