25. Gestione degli Errori
Teoria sulle Eccezioni
Come abbiamo visto nel capitolo Strutture di controllo, al verificarsi di una situazione inaspettata, quindi di un errore dal momento che l'applicazione non è stata programmata per produrre quello stato, è possibile interrompere lo script con le istruzioni exit e die.
Così facendo però non si ha una gestione dell'errore intelligente ma una drastica terminazione dello script.
Per essere precisi, il termine esatto per definire questi eventi inaspettati che si verificano durante l'esecuzione dello script, è Eccezioni.
Un evento imprevisto, un baco nello script, la perdita di una connessione al Database, sono tutte considerate eccezioni che PHP ci consente di gestire attraverso tre comandi molto semplici :
- throw - Solleva un'eccezione
- try - Se si verifica un'eccezione nel codice del blocco try, quest ultimo fa saltare l'esecuzione del codice al blocco catch
- catch - Contiene il codice alternativo che viene eseguito al verificarsi dell'eccezione
Il sistema è molto semplice ed è paragonabile ad un normale blocco IF ELSE. Il codice per cui intendete gestire le eccezioni va all'interno del blocco try, che obbligatoriamente dovrà avere un blocco antagonista catch che conterrà il codice alternativo da eseguire nel caso in cui si verificasse un'eccezione. Se all'interno del blocco try si verifica una condizione per cui viene chiamato il comando throw, allora l'esecuzione salta al blocco catch. Non è necessario che l'istruzione throw si trovi esattamente nel blocco try, ma può essere richiamata anche da una funzione o da un metodo di un oggetto all'interno di try. |
Esempio di gestione errori
Nell'esempio che segue vedremo del codice che ha come compito il controllo dei dati di un utente.
Se i dati vengono ritenuti adeguati si procede alla registrazione nel database, altrimenti si notifica l'errore all'utente, mettendogli a
disposizione un link per tornare indietro a reinserire i dati.
Il codice essendo solo dimostrativo, considera i dati non validi se superano una certa lunghezza, e rimanda l'utente ad una ipotetica pagina di registrazione chiamata registrazione.php :
<?php
define("MAX_LUNGHEZZA", 20);
function registraUtente()
{
// ... codice per registrare l'utente nel database
$registrato = true; // Simuliamo una registrazione avvenuta con successo
if ($registrato)
echo "Utente registrato con successo!";
else
throw new Exception("Impossibile registrare l'utente!");
}
/* --- Inizio dati Utente --- */
$nome_utente = "Agamennone";
$pass_utente = "supercalifragilistichespiralidoso";
/* --- Fine dati Utente --- */
try
{
if (strlen($nome_utente) > MAX_LUNGHEZZA)
throw new Exception("Nome utente troppo lungo!");
if (strlen($pass_utente) > MAX_LUNGHEZZA)
throw new Exception("Password troppo lunga!");
registraUtente();
}
catch (Exception $exc)
{
echo "Errore : " . $exc->getMessage() . "<br />\n\n";
echo "<br /><a href=\"registrazione.php\">Torna indietro</a> per reinserire i dati.";
}
?>Il codice soprastante produce questo risultato.
Se provate a modificare la variabile $nome_utente con una stringa
più lunga di 20 caratteri, otterrete invece il seguente messaggio : Impostando la variabile $registrato col valore false, all'interno della funzione "registraUtente()",
simuliamo un fallimento nella registrazione e viene sollevata una nuova eccezione ottenendo il messaggio : Ovviamente per far verificare l'ultimo caso descritto, è necessario dare alle due variabili $nome_utente e $pass_utente, una lunghezza minore o uguale a 20, perchè vengono controllate prima dell'esecuzione della funzione "registraUtente()." |
Osservazioni sulle eccezioni
Come avrete notato dall'ultimo esempio, quando throw solleva un'eccezione, manda al dovuto blocco catch un'istanza della classe Exception, nativa di PHP.
Throw quindi, utilizza new per creare una nuova istanza, e a seguire il costruttore di Exception con un messaggio opzionale per inizializzarne l'istanza.
La suddetta istanza viene poi catturata da catch, che si serve del metodo "getMessage()" per leggere il messaggio inviatogli da throw e gestire l'eccezione come programmato.
Nota : Se viene sollevata un'eccezione al di fuori di un blocco try / catch, questa interromperà lo script con un errore fatale
:
Fatal error: Uncaught exception ...

