Gestione errori PHP

Nel PHP, la gestione degli errori di default è molto semplice. Un messaggio viene inviato al browser, che contiene il nome del file, il numero della riga e un messaggio di descrizione dell'errore.

Gestione errori PHP

Quando si creano script e applicazioni web, la gestione degli errori è una parte importante. Se il tuo codice manca di codifica di rilevamento degli errori, il programma sembra poco professionale e apre la strada a rischi di sicurezza.

Questo tutorial introduce alcuni dei metodi di rilevamento degli errori più importanti in PHP.

Vi spiegheremo diversi metodi di gestione degli errori:

  • Semplice istruzione "die()"
  • Errori personalizzati e trigger di errore
  • Report di errore

Gestione degli errori di base: utilizzo della funzione die()

Il primo esempio mostra uno script semplice per aprire un file di testo:

<?php
$file=fopen("welcome.txt","r");
?>

Se il file non esiste, otterrete un errore simile a questo:

Attenzione: fopen(welcome.txt) [function.fopen]: impossibile aprire lo stream: 
File o directory non trovato in C:\webfolder\test.php alla riga 2

Per evitare che l'utente riceva un messaggio di errore simile a quello sopra, controlliamo l'esistenza del file prima di accedervi:

<?php
if(!file_exists("welcome.txt"))
 {
 die("File non trovato");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Ora, se il file non esiste, otterrete un messaggio di errore simile a questo:

File non trovato

Il codice sopra è più efficace rispetto a quello precedente, poiché adotta un meccanismo di gestione degli errori semplice che termina lo script dopo l'errore.

Tuttavia, interrompere semplicemente lo script non è sempre il modo corretto. Studiamo le funzioni PHP alternative per la gestione degli errori.

Creare un gestore di errori personalizzato

Creare un gestore di errori personalizzato è molto semplice. Abbiamo semplicemente creato una funzione dedicata che può essere chiamata quando si verifica un errore in PHP.

Questa funzione deve essere in grado di gestire almeno due parametri (livello di errore e messaggio di errore), ma può accettare fino a cinque parametri (opzionali: file, numero di riga e contesto di errore):

Sintassi

error_function(error_level, error_message,
error_file, error_line, error_context)
Parametro Descrizione
error_level

Obbligatorio. Regola di errore definita dall'utente per stabilire il livello di report di errore. Deve essere un valore numerico.

Vedere la tabella sottostante: livello di report di errore.

error_message Obbligatorio. Regola di errore definita dall'utente per stabilire il messaggio di errore.
error_file Opzionale. Specifica il nome del file in cui si verifica l'errore.
error_line Opzionale. Specifica il numero di riga in cui si verifica l'errore.
error_context Opzionale. Specifica un array che contiene ogni variabile utilizzata quando si verifica un errore e i loro valori.

Livello di report degli errori

Questi livelli di report degli errori sono diversi tipi di errori che il gestore degli errori è progettato per gestire:

Valore Costante Descrizione
2 E_WARNING Errori di runtime non fatali. Non interrompono l'esecuzione dello script.
8 E_NOTICE

Notifica di runtime.

Il script rileva che potrebbe esserci un errore, ma potrebbe anche verificarsi durante l'esecuzione regolare dello script.

256 E_USER_ERROR Errori generati dall'utente fatali. Simili agli E_ERROR impostati dal programmatore utilizzando la funzione PHP trigger_error().
512 E_USER_WARNING Avvisi generati dall'utente non fatali. Simili agli E_WARNING impostati dal programmatore utilizzando la funzione PHP trigger_error().
1024 E_USER_NOTICE Notifiche generate dall'utente. Simili alle E_NOTICE impostate dal programmatore utilizzando la funzione PHP trigger_error().
4096 E_RECOVERABLE_ERROR Errori fatali catturabili. Simili a E_ERROR, ma catturabili dal gestore degli errori definito dall'utente. (Vedere set_error_handler())
8191 E_ALL

Tutti gli errori e gli avvisi, eccetto il livello E_STRICT.

(In PHP 6.0, E_STRICT è parte di E_ALL)

Ora, creiamo una funzione per gestire gli errori:

function customError($errno, $errstr)
 { 
 echo "<b>Errore:</b> [$errno] $errstr<br />";
 echo "Fine dello script";
 die();
 }

Il codice sopra riportato è una funzione di gestione degli errori semplice. Quando viene attivata, ottiene il livello di errore e il messaggio di errore. Poi esce il livello di errore e il messaggio e termina lo script.

Ora che abbiamo creato una funzione di gestione degli errori, dobbiamo determinare quando farla scattare.

Impostare Gestore Errori

Il gestore degli errori predefinito di PHP è il gestore degli errori integrato. Intendiamo trasformare la funzione sopra riportata nel gestore degli errori predefinito durante l'esecuzione dello script.

È possibile modificare il gestore degli errori in modo che applichi solo a certi errori, permettendo allo script di gestire diversi errori in modi diversi. Tuttavia, in questo esempio, intendiamo utilizzare il nostro gestore degli errori personalizzato per tutti gli errori:

set_error_handler("customError");

Poiché desideriamo che la nostra funzione personalizzata gestisca tutti gli errori, set_error_handler() richiede solo un parametro, ma può accettare un secondo parametro per determinare il livello di errore.

Esempio

Testa questo gestore di errori cercando di outputtere una variabile inesistente:

<?php
//funzione gestore errori
function customError($errno, $errstr)
 { 
 echo "<b>Errore:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

L'output del codice sopra dovrebbe essere simile a:

Errore: [8] Variabile non definita: test

Attivazione degli errori

In posizioni di input utente nello script, quando l'input dell'utente è invalido, è utile attivare errori. In PHP, questo compito è completato da trigger_error().

Esempio

In questo esempio, se la variabile "test" è maggiore di "1", si verifica un errore:

<?php
$test=2;
if ($test>1)
{
trigger_error("Il valore deve essere 1 o inferiore");
}
?>

L'output del codice sopra dovrebbe essere simile a:

Attenzione: Il valore deve essere 1 o inferiore
in C:\webfolder\test.php on line 6

Puoi attivare un errore in qualsiasi parte dello script, specificando il livello dell'errore tramite il secondo parametro.

Tipi di errori possibili:

  • E_USER_ERROR - Errore di runtime generato dall'utente fatale. L'errore non può essere riparato. L'esecuzione dello script viene interrotta.
  • E_USER_WARNING - Avviso di runtime generato dall'utente non fatale. L'esecuzione dello script non viene interrotta.
  • E_USER_NOTICE - Predefinito. Notifica di runtime generata dall'utente. Lo script ha rilevato un errore possibile, ma potrebbe anche verificarsi durante l'esecuzione normale dello script.

Esempio

In questo esempio, se la variabile "test" è maggiore di "1", si verifica un errore E_USER_WARNING. Se si verifica un E_USER_WARNING, utilizzeremo il nostro gestore di errori personalizzato e termineremo lo script:

<?php
//funzione gestore errori
function customError($errno, $errstr)
 { 
 echo "<b>Errore:</b> [$errno] $errstr<br />";
 echo "Fine dello script";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Il valore deve essere 1 o inferiore",E_USER_WARNING);
 }
?>

L'output del codice sopra dovrebbe essere simile a:

Errore: [512] Il valore deve essere 1 o inferiore
Fine dello script

Ora che abbiamo imparato a creare i nostri errori e come attivarli, esaminiamo la registrazione degli errori.

Registrazione degli errori

Per default, in base alla configurazione di error_log nel php.ini, PHP invia i record di errore al sistema di registrazione degli errori del server o a un file. Utilizzando la funzione error_log(), è possibile inviare record di errore a un file o a un destino remoto.

Inviare un messaggio di errore a se stessi tramite e-mail è un ottimo modo per ottenere notifiche su errori specifici.

Messaggio di errore inviato tramite E-Mail

Nell'esempio seguente, se si verifica un errore specifico, invieremo un'e-mail con il messaggio di errore e termineremo lo script:

<?php
//funzione gestore errori
function customError($errno, $errstr)
 { 
 echo "<b>Errore:</b> [$errno] $errstr<br />";
 echo "Il webmaster è stato notificato";
 error_log("Errore: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Il valore deve essere 1 o inferiore",E_USER_WARNING);
 }
?>

L'output del codice sopra dovrebbe essere simile a:

Errore: [512] Il valore deve essere 1 o inferiore
Il webmaster è stato notificato

Le e-mail ricevute dal codice sopra sono simili a:

Errore: [512] Il valore deve essere 1 o inferiore

Questo metodo non è adatto per tutti gli errori. Gli errori standard dovrebbero essere registrati utilizzando il sistema di registrazione predefinito di PHP sul server.