Menu
Coddy logo textTech

Chamadas Protegidas com pcall()

Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 33 de 54.

Enquanto error() interrompe seu programa quando algo dá errado, às vezes você quer lidar com erros sem que ele trave. A função pcall() do Lua permite que você execute código que pode falhar de forma segura.

O nome pcall() significa "chamada protegida" (protected call). Ele envolve uma chamada de função em uma camada protetora que captura quaisquer erros. Em vez de seu programa travar, o 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 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 em execução e pode lidar com o erro de forma elegante verificando o valor de status.

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 realizar a operação matemática solicitada de forma segura. 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") se for verdade, 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 (número): O primeiro operando
  • b (número): O segundo operando

Retorna: Uma string contendo "Result: " seguido pelo resultado do cálculo, ou "Error: " seguido pela mensagem de erro (string)

Folha de consulta

A função pcall() (protected call) permite que você execute código que pode falhar com segurança, sem travar o seu programa.

Sintaxe básica:

local status, result = pcall(functionName, arg1, arg2)

pcall() retorna dois valores:

  • status: true se a função for bem-sucedida, false se ocorrer um erro
  • result: O valor de retorno da função se for bem-sucedida, ou a mensagem de erro se ocorrer um erro

Exemplo:

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

Isso captura o erro em vez de travar, permitindo que o programa continue e trate o erro de forma adequada.

Experimente você mesmo

function safeCalculate(operation, a, b)
    -- Escreva o código aqui
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 Logic & Flow