ECCEZIONI IN PHP
INTRODUZIONE ALLE ECCEZIONI
Da PHP 5 abbiamo a disposizione il meccanismo delle eccezioni. Se chiediamo ad un utente di inserire un numero tra uno e dieci l’eccezione si ha quando il numero è al di fuori di questo range. Quando parliamo di eccezioni parliamo di oggetti della classe Exception. Facciamo un esempio con la classe FileManager. Una eccezione si solleva con l’istruzione
throw new Exception
Se solleviamo un’eccezione qualcuno da qualche parte dovrà gestirla, se non è così si verifica un errore fatale. Le eccezioni vengono catturate con i blocchi try (prova a eseguire il seguente codice) catch (cattura).
Quello riportato a fianco è il var_dump() che dimostra che l’eccezione sollevata con new Exception la ritroviamo dentro la variabile $e.
PROPRIETA’ E METODI DELLA CLASSE EXCEPTION
SOLLEVARE UNA ECCEZIONE E STACK TRACE
Il codice della classe FileManager non è un buon codice considerando che abbiamo molte istruzioni nel costruttore e potremmo avere la necessità di inserirne altre. L’interprete PHP dopo che è stata sollevata una eccezione cerca in quel codice un blocco try catch, se non lo trova risale lo stack delle chiamate fino a trovarne uno. Se non lo trova il codice termina con una eccezione non gestita. Per dimostrare ciò, se ora portiamo il try catch all’interno del costruttore vedremo che non avremo differenze. Riporto il codice prima della modifica.
Quando viene sollevata l’eccezione nel metodo privato, PHP inizia a risalire lo stack; quindi, passa nel costruttore che invoca il metodo.
A runtime qualora neanche nel costruttore si trovasse un blocco try catch questi verrà cercato nel codice che crea l’oggetto. Se spostiamo il try catch in quel punto riusciamo ugualmente a gestire l’errore. Ora tutto lo stack trace è stato percorso a ritroso alla ricerca di un blocco che gestisce l’errore. Se non viene trovato viene generata una eccezione.
Vediamo il var_dump del metodo getTrace().
BLOCCO FINALLY
Il codice contenuto all’interno del blocco finally viene sempre eseguito, sia che solleviamo una eccezione o meno. Serve ad esempio a chiudere la connessione a un database o un file.
ESTENDERE LA CLASSE EXECPTION
GESTIRE ECCEZIONI MULTIPLE
Si indicano prima i catch più specifici, poi essendo Exception la superclasse questa catturerà tutte le eccezioni non presenti nei blocchi catch.
GESTIRE ECCEZIONI NON CATTURATE CON SET_EXCEPTION_HANDLER
CATTURARE ECCEZIONI MULTIPLE NEL BLOCCO CATCH
Separando le eccezioni con il simbolo pipe è possibile catturare più eccezioni nel blocco catch.
Con set_exception_handler possiamo definire un metodo per gestire tutte le eccezioni non catturate.
GESTIRE ECCEZIONI ED ERRORI CON THROWABLE
Possiamo parlare di errori per qualcosa generato internamente da PHP, di eccezioni per errori generati dall’utente e dall’utilizzo in sé dell’applicazione. Volendo però potremmo sollevare errori e non eccezioni.
Non possiamo mettere Exception perché la classe Error non è una classe figlia, si otterrebbe un errore fatale. Andiamo nella documentazione di PHP e cerchiamo la classe Error.
Dato che la classe Error implementa l’interfaccia Throwable vuol dire che possiamo usare tutti i metodi dell’interfaccia. Sia la classe Exception che la classe Error implementano questa interfaccia, questo vuol dire che all’interno del catch possiamo indicare Throwable. Quindi sia che lanciamo una eccezione o un errore l’applicazione funzionerà regolarmente. C’è però da fare un’altra valutazione: È vero che con Throwable catturiamo un po’ tutto però è anche vero che così facendo non abbiamo idea di ciò che è stato generato nel try, a meno che nel catch non scriviamo un po’ di codice per sapere quale oggetto ha sollevato l’eccezione utilizzando $e ed instanceof.
Utilizzando eccezioni più specifiche il codice è migliore a livello di semantica, ovvero chi guarda il codice potrebbe capire subito che il problema generato nel try è una divisione per zero.
APPROFONDIMENTO
Le eccezioni in PHP consentono di gestire gli errori in modo controllato, permettendo al programma di continuare l’esecuzione o terminare in maniera elegante. Quando si verifica un errore in PHP, il motore genera un’eccezione che può essere “catturata” e gestita. Le eccezioni sono oggetti che vengono creati a partire dalla classe base Exception.
Sintassi di base
Ecco una sintassi di esempio per la gestione delle eccezioni in PHP:
try {
// Codice che potrebbe generare un’eccezione
if ($condizione) {
throw new Exception(“Messaggio d’errore”);
}
} catch (Exception $e) {
// Gestione dell’eccezione
echo “Eccezione catturata: ” . $e->getMessage();
} finally {
// Codice che viene sempre eseguito, sia in caso di eccezione che non
echo “Questo blocco viene sempre eseguito.“;
Descrizione dei blocchi
1. try: Il blocco try contiene il codice che potrebbe generare un’eccezione. Se si verifica un’eccezione, il flusso del programma passa al blocco catch.
2. throw: La parola chiave throw serve a lanciare un’eccezione manualmente. Viene utilizzata insieme a un’istanza della classe Exception (o una sua classe derivata).
3. catch: Il blocco catch serve per catturare l’eccezione e gestirla. Riceve come argomento l’oggetto dell’eccezione, che può essere usato per ottenere informazioni come il messaggio d’errore ($e->getMessage()), il codice dell’errore ($e->getCode()) e altre proprietà.
4. finally (opzionale): Il blocco finally contiene il codice che viene eseguito sia che un’eccezione venga lanciata o meno. È utile per operazioni di pulizia o chiusura di risorse come file o connessioni a database.
Metodi principali della classe Exception
•getMessage(): Ritorna il messaggio d’errore specificato durante il lancio dell’eccezione.
•getCode(): Ritorna il codice d’errore, se fornito.
•getFile(): Ritorna il nome del file in cui è stata lanciata l’eccezione.
•getLine(): Ritorna la linea di codice in cui è stata lanciata l’eccezione.
•getTrace(): Ritorna l’array di stack trace.
•getTraceAsString(): Ritorna lo stack trace come stringa.
Creare eccezioni personalizzate
È possibile creare delle proprie eccezioni personalizzate ereditando dalla classe Exception o una delle sue sottoclassi:
class MiaEccezione extends Exception {
public function messaggioPersonalizzato() {
return “Errore personalizzato: ” . $this->getMessage();
}
}
try {
throw new MiaEccezione(“Qualcosa è andato storto.“);
} catch (MiaEccezione $e) {
echo $e->messaggioPersonalizzato();
}
Gerarchia delle eccezioni
In PHP, tutte le eccezioni derivano dalla classe base Exception. Ci sono anche altre classi di eccezioni già pronte, come:
• LogicException: Usata per errori di logica nel programma.
• RuntimeException: Usata per errori che avvengono durante l’esecuzione del programma.
Esempio completo
class ErroreDiLogin extends Exception {
// Classe di eccezione personalizzata
}
function login($utente, $password) {
if ($utente !== “admin” || $password !== “1234“) {
throw new ErroreDiLogin(“Credenziali non valide.“);
}
echo “Accesso riuscito!“;
}
try {
login(“utente“, “password“);
} catch (ErroreDiLogin $e) {
echo “Eccezione catturata: ” . $e->getMessage();
} finally {
echo “Chiusura connessione.“;
}
}
In questo esempio, se l’utente e la password non sono corretti, viene lanciata un’eccezione personalizzata e il programma cattura l’errore.
Lascia un commento