English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, imparerai come utilizzare le funzionalità di gestione degli errori di PHP per gestire agevolmente le situazioni di errore.
A volte, la tua applicazione potrebbe non funzionare correttamente, causando errori. Ci sono molti motivi che possono causare errori, ad esempio:
Il server web potrebbe avere spazio su disco insufficiente
L'utente potrebbe aver inserito un valore non valido nel campo del modulo
Il file o il record del database che stai cercando di accedere potrebbe non esistere
L'applicazione potrebbe non avere i permessi di scrittura sui file sul disco
Il servizio che l'applicazione deve accedere potrebbe essere temporaneamente non disponibile
Questi tipi di errori vengono chiamati errori in tempo di esecuzione perché si verificano durante l'esecuzione dello script. Differiscono dagli errori di sintassi che devono essere corretti prima della esecuzione dello script.
Le applicazioni professionali devono avere funzionalità appropriate per gestire tali errori in tempo di esecuzione. Di solito, questo significa informare chiaramente e accuratamente l'utente di ciò che è successo.
Di solito, quando si verifica un problema che impedisce al script di funzionare correttamente, il motore PHP attiva un errore. Ogni errore è rappresentato da un valore numerico e da una costante associata. La tabella seguente elenca alcuni livelli di errore comuni:
Livello di errore | Valore | Descrizione |
---|---|---|
E_ERROR | 1 | Errore in tempo di esecuzione fatale, non ripristinabile. L'esecuzione dello script viene interrotta immediatamente. |
E_WARNING | 2 | Avviso in tempo di esecuzione. Non è fatale, la maggior parte degli errori appartiene a questa categoria. L'esecuzione dello script non viene interrotta. |
E_NOTICE | 8 | Notifica in tempo di esecuzione. Indica che lo script ha incontrato una situazione che potrebbe causare un errore, anche se potrebbe accadere durante l'esecuzione normale dello script. |
E_USER_ERROR | 256 | Messaggio di errore fatale generato dall'utente. È simile a E_ERROR, ma è generato dallo script PHP utilizzando la funzione trigger_error() piuttosto che dal motore PHP. |
E_USER_WARNING | 512 | Avviso generato dall'utente non fatale. È simile a E_WARNING, ma è generato dallo script PHP utilizzando la funzione trigger_error() piuttosto che dal motore PHP. |
E_USER_NOTICE | 1024 | Messaggio di notifica generato dall'utente. È simile a E_NOTICE, ma è generato dallo script PHP utilizzando la funzione trigger_error() piuttosto che dal motore PHP. |
E_STRICT | 2048 | In senso stretto non è un errore, ma PHP attiva quando incontra codice che potrebbe causare problemi o incompatibilità non retroattiva. |
E_ALL | 8191 | tutti gli errori e gli avvisi, esclusi E_STRICT prima di PHP 5.4.0. |
Per ulteriori livelli di errore, consultaLivelli di errore PHPdi riferimento.
Ogni volta che uno script PHP incontra un problema, il motore PHP attiva un errore, ma puoi anche attivare tu stesso un errore per generare messaggi di errore più amichevoli per l'utente. In questo modo, puoi rendere l'applicazione più complessa. Di seguito vengono descritte alcune delle metodologie comuni per la gestione degli errori PHP:
Considera l'esempio seguente, che tenta solo di aprire un file di testo in modalità di sola lettura.
<?php // Tentativo di aprire un file non esistente $file = fopen("sample.txt", "r"); ?>
Se il file non esiste, potresti ricevere l'errore seguente:
Attenzione: fopen(sample.txt) [funzione.fopen]: impossibile aprire lo stream: File o directory non trovato in C:\wamp\www\project\test.php alla riga 2
Seguendo alcuni semplici passaggi, possiamo prevenire che l'utente riceva messaggi di errore di questo tipo.
<?php if(file_exists("sample.txt")){ $file = fopen("sample.txt", "r"); } else { die("Errore: Il file che stai cercando di accedere non esiste."); } ?>
Ora, se esegui lo script sopra riportato, riceverai il seguente messaggio di errore:
Errore: Il file che stai cercando di accedere non esiste.
Come puoi vedere, attraverso la realizzazione di semplici controlli sulla presenza del file prima di tentare di accedervi, possiamo generare messaggi di errore più significativi per l'utente.
Se non viene trovato il file "sample.txt", la funzione die() utilizzata sopra mostrerà solo un messaggio di errore personalizzato e terminerà lo script corrente.
Puoi creare la tua funzione di gestione degli errori per gestire gli errori di runtime generati dal motore PHP. Il programma di gestione degli errori personalizzato ti offre una maggiore flessibilità e un migliore controllo sugli errori, può controllare gli errori e decidere come gestirli, può mostrare un messaggio all'utente, registrare l'errore in un file o un database o inviarlo via email, cercare di risolvere il problema e continuare, uscire dall'esecuzione dello script o ignorare completamente l'errore.
La funzione di gestione degli errori personalizzata deve essere in grado di gestire almeno due parametri (errno e errstr), ma può accettare ulteriori tre parametri (errfile, errline e errcontext), come descritto di seguito:
Parametro | Descrizione |
---|---|
Obbligatorio - I seguenti parametri sono obbligatori | |
errno | Specificare il livello di errore come intero. Questo corrisponde ai costanti di livello di errore appropriati (E_ERROR, E_WARNING, ecc.) |
errstr | Specificare il messaggio di errore come stringa |
Opzionale - I seguenti parametri sono opzionali | |
errfile | Specificare il nome del file dello script che ha causato l'errore come stringa |
errline | Specificare il numero di riga dell'errore come stringa |
errcontext | Specificare un array che contiene tutte le variabili esistenti e i loro valori quando si verifica un errore. Utile per il debug |
Ecco un esempio di funzione di gestione degli errori personalizzata semplice. Qualsiasi errore, anche il più insignificante, scatena questo gestore customError(). Poi, stampa i dettagli dell'errore nel browser e ferma l'esecuzione dello script.
<?php //Funzione di gestione degli errori function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } ?>
Devi dire a PHP di utilizzare la tua funzione di gestione degli errori personalizzata - chiama semplicemente la funzione built-in set_error_handler() e passa il nome della funzione.
<?php //Funzione di gestione degli errori function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } //Impostare il gestore degli errori set_error_handler("customError"); //Eseguire un errore echo($test); ?>
Puoi anche registrare i dettagli dell'errore nel file di log, come indicato di seguito:
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("calcDivision(): il divisore non può essere zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message = "Errore: [" . $errno . "] - " . "$errstr in $errfile alla riga $errline;" $message .= "Variabili:" . print_r($errcontext, true) . "\r\n"; error_log($message, 3, "logs/app_errors.log"); die("Si è verificato un problema, riprova."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "Questo non verrà stampato mai."; ?>
Puoi anche inviare una email con dettagli dell'errore utilizzando la funzione error_log().
<?php function calcDivision($dividend, $divisor) { if ($divisor == 0){ trigger_error("calcDivision(): il divisore non può essere zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message = "Errore: [" . $errno . "] - " . "$errstr in $errfile alla riga $errline;" $message .= "Variabili:" . print_r($errcontext, true) . "\r\n"; error_log($message, 1, "[email protected]"); die("Si è verificato un problema, riprovate. Il rapporto di errore è stato inviato all'amministratore del sito."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "Questo non verrà stampato mai."; ?>
Nonostante il motore PHP generi errori quando si incontrano problemi nello script, è anche possibile generare errori manualmente. Questo può rendere la vostra applicazione più robusta, poiché può segnalare potenziali problemi prima che diventino errori gravi.
Per generare un errore all'interno dello script, chiamare la funzione trigger_error() e passare il messaggio di errore da generare:
trigger_error("Si è verificato un problema.");
Consideriamo una funzione che calcola la divisione di due numeri.
<?php function calcDivision($dividend, $divisor) { return($dividend / $divisor); } //Chiamata alla funzione echo calcDivision(10, 0); ?>
Se si passa come parametro zero a $divisor, il messaggio di errore generato dal motore PHP sarà simile al seguente:
Attenzione: Divisione per zero in C:\wamp\www\project\test.php alla riga 3
Questa messaggio sembra contenere poco. Vediamo un esempio di come generare un errore utilizzando la funzione trigger_error().
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("Il divisore non può essere zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } //Chiamata alla funzione echo calcDivision(10, 0); ?>
Ora, lo script genera questo messaggio di errore:
Attenzione: Il divisore non può essere zero in C:\wamp\www\project\error.php alla riga 4
Come vedete, il messaggio di errore generato dal secondo esempio è più chiaro rispetto a quello del primo esempio, spiegando il problema.