Menu
Coddy logo textTech

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

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

challenge icon

Desafio

Fácil

Escreva 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 chame error("Division by zero") se for verdadeiro, caso contrário retorne a / 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 operando
  • b (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.
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