Chiamate protette con pcall()
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 33 di 54.
Mentre error() interrompe il programma quando qualcosa va storto, a volte vuoi gestire gli errori senza causare un arresto anomalo. La funzione pcall() di Lua ti permette di eseguire in sicurezza codice che potrebbe non riuscire.
Il nome pcall() sta per «chiamata protetta». Avvolge una chiamata di funzione in uno strato protettivo che intercetta eventuali errori. Invece di bloccarsi, il tuo programma riceve da pcall() informazioni su ciò che è successo.
Ecco la sintassi di base:
local status, result = pcall(functionName, arg1, arg2)La funzione pcall() restituisce due valori. Il primo è uno stato booleano: true se la funzione è riuscita oppure false se si è verificato un errore. Il secondo valore dipende dallo stato: in caso di successo, è il valore restituito dalla funzione; in caso di errore, è il messaggio di errore.
Ecco un esempio pratico:
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)
endIn questo esempio, la divisione per zero genera un errore, ma invece di bloccarsi, pcall() lo intercetta. Il programma continua a funzionare e può gestire l’errore in modo appropriato controllando il valore di stato.
Sfida
FacileScrivi una funzione safeCalculate che accetta operation, a e b e restituisce il risultato del calcolo oppure un messaggio di errore.
La funzione dovrebbe usare pcall() per eseguire in sicurezza l'operazione matematica richiesta. Crea una funzione interna che esegua il calcolo in base alla stringa dell'operazione, quindi avvolgila con pcall() per intercettare eventuali errori.
Logica:
- Crea una funzione interna che controlli il tipo di operazione ed esegua il calcolo
- Per "add", restituisci
a + b - Per "subtract", restituisci
a - b - Per "multiply", restituisci
a * b - Per "divide", controlla se
bè 0 e chiamaerror("Division by zero", 0)se è vero; altrimenti restituiscia / b - Per qualsiasi altra operazione, chiama
error("Invalid operation", 0) - Usa
pcall()per eseguire la funzione interna - Se l'esecuzione ha esito positivo, restituisci
"Result: "seguito dal risultato - Se si verifica un errore, restituisci
"Error: "seguito dal messaggio di errore
Passa 0 come secondo argomento di error(). Questo argomento è il livello di errore e 0 dice a Lua di non anteporre al messaggio il nome del file e il numero di riga, così la stringa restituita è esattamente "Error: Division by zero".
Parametri:
operation(stringa): l'operazione da eseguire ("add", "subtract", "multiply" o "divide")a(numero): il primo operandob(numero): il secondo operando
Valore restituito: una stringa contenente "Result: " seguito dal risultato del calcolo oppure "Error: " seguito dal messaggio di errore (stringa)
Provalo tu
function safeCalculate(operation, a, b)
-- Scrivi il codice qui
-- Nota: chiama error(message, 0) affinché Lua non aggiunga il nome del file e il
-- numero di riga davanti al tuo messaggio.
endQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più altiEsercitati da solo: Compilatore Lua online