PHP Error Handling
§ 1. PHP Error Handling
La gestione degli errori di default di PHP è molto semplice: Un messaggio di errore con il nome del file, il numero di linea, ed un messaggio che descrive l'errore viene inviato al browser.
§ 1.1. Gestione degli errori
Nella creazione di script ed applicazioni web la gestione degli errori è una parte molto importante del lavoro. Gli esempi che seguono illustrano diverse modalità di gestione degli errori offerte da PHP:
- Lo statement "die()"
- Errori personalizzati e trigger
- Reporting degli errori
$ 1.2. Gestione base degli errori con la funzione die()
Il primo esempio mostra un semplice script che apre un file di testo:
<?php
$file=fopen("welcome.txt","r");
?>
Se il file non esite potresti ricevere un errore come questo:
Warning: fopen(welcome.txt)[function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
Per evitare ch l'utente riceva un messaggio come questo, si può testare l'esistenza del file prima di tentarne l'apertura:
<?php
if(!file_exists("welcome.txt")) {
die("File not found");
} else {
$file=fopen("welcome.txt","r");
}
?>
Così, se il fine non esiste, riceverai il messaggio:
File not found
Questo codice è più efficiente del precedente, perchè usa un semplice meccanismo di gestione dell'errore che blocca l'esecuzione dello script subito dopo la rilevazione dell'errore.
Comunque, la semplice interruzione dello script non sempre è la strada giusta da percorrere. PHP offre anche altre possibilità.
$ 1.3. Creazione di un Error Handler personalizzato
Creare un error handler personalizzato è semplice. Creiamo un funzione speciale che può essere chiamata quando si verifica un errore.
Questa funzione deve gestire un minimo di due parametri (error level e error message), ma può accettare altri tre parametri opzionali (file, line number, error_context)
Sintassi
error_function(error_level, error_message, error_file, error_line, error_context);
Parametro | Descrizione |
---|---|
error_level | Richiesto. Specifica l'error report level. Deve essere un numero. Vedi la tabella seguente. |
error_message | Richiesto. Specifica il messaggio d'errore. |
error_file | Opzionale. Specifica il nome del file in cui si è verificato l'errore. |
error_line | Opzionale. Specifica il numero di linea in cui si è verificato l'errore. |
error_context | Opzionale. Specifica un array contente ogni variabile, ed il loro valore, in uso quando si è verificato l'errore. |
Valore | Costante | Descrizione |
---|---|---|
2 | E_WARNING | Errore a run-time non fatale. L'esecuzione dello script non viene interrotta. |
8 | E_NOTICE | Informazione. Lo script ha trovato qualcosa che potrebbe essere un errore, ma che potrebbe anche verificarsi durante la normale esecuzione. |
256 | E_USER_ERROR | Fatale, generato dall'utente. Questo è come un E_ERROR settato dal programmatore con la funzione trigger_error(). |
512 | E_USER_WARNING | Non fatale. Questo è come un E_WARNING settato dal programmatore con la funzione trigger_error(). |
1024 | E_USER_NOTICE | Informazione. Questo è come un E_NOTICE settato dal programmatore con la funzione trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Errore fatale catturabile. Questo è come un E_ERROR ma può essere catturato da un handler definito dall'utente (vedi la funzione set_error_handler()) |
8191 | E_ALL | Tutti gli errori ed i warnings. (E_STRICT diventa parte di E_ALL in PHP 5.4. |
Ora creiamo una funzione per gestire gli errori.
<?php
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
?>
Questo codice è un semplice error handler. Quando è innescato, ottiene l'error level ed un messaggio di errore. Successivamente visualizza livello di errore e messaggio e termina lo script.
Ora che abbiamo creato l'error handler, dobbiamo decidere quando innescarlo.
$ 1.4. Settaggio dell'Error Handler
L'error handler di default per PHP è l'error handler incorporato. Andremo a costruire un error handler sovrapposto a quello di default, per la durata dello script.
E' possibile cambiare l'error handler da applicare solo per qualche errore. Lo script può gestire diversi errori in modi differenti. Comunque, in questo esempio, utilizzeremo il nostro error handler per tutti gli errori:
Sintassi
set_error_handler("customError");
Dal momento che vogliamo che il nostro error handler personalizzato gestisca tutti gli errori, la funzione set_error_handler ha bisogno di un solo parametro. Un secondo parametro potrà essere aggiunto per specificare un error level.
Esempio
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
Il codice precedente dovrebbe produrre qualcosa di simile:
Error: [8] - Undefined variable: test.
$ 1.5. Innescare un errore
In uno script in cui un utente può inserire dati è utile innsecare errori quando capita un imput illegale. In PHP questo si può fare con la funzione trigger_err()
Esempio
<?php
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below");
}
?>
Il codice precedente dovrebbe produrre qualcosa di simile:
Notice: Value must be 1 or below
in C\webfolder\test.php on line 6
Un errore può essere innescato ovunque in un script, e aggiundo un secondo parametro, puoi specificare quale livello di errore deve essere innescato.
Possibili tipi di errore sono:
- E_USER_ERROR - Errore fatale a run-time. Non può essere recuperato. Interrompe lo script.
- E_USER_WARNING - Errore non fatale generato a run-time. Non interrompe lo script.
- E_USER_NOTICE - Informazione generata a run-time. Potrebbe essere un errore, ma non è detto. Non interrompe lo script.
Esempio
In questo esempio capita un E_USER_WARNING se la variabile test è più grande di 1.
<?php
//error handler function
function customError3($errno, $errstr) {
echo "Error: [$errno] $errstr
";
echo "Ending Script";
//die();
}
//set error handler
set_error_handler("customError3",E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
Il codice precedente dovrebbe produrre qualcosa di simile:
Error: [512] Value must be 1 or below
Ending Script.
Ending Script
Lo script non termina perchè ho commentato lo statement die(). In caso contrario il film sarebbe finito.
§ 1.6. Error Logging
Per default PHP trasmette un errore al logging system del server o ad un file a seconda di come è configurato l'error-log nel file php.ini. Usando la funzione error_log() puoi invare gli error logs a uno specifico file o ad una destinazione remota.
$ 1.7. Inviare un Error Message via E-Mail
Nell'esempio che segue invieremo un e-mail con un messaggio di errore, ma non interromperemo lo script.
In questo modo, fra l'altro, oltre a provare questo cazzo di funzione, saprò se per caso, qualcuno ha aperto la pagina in oggetto.
Esempio
<?php
//error handler function
function customError4($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"cla.minelli@gmail.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError4",E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
Webmaster has been notified
Il codice precedente dovrebbe produrre qualcosa di simile:
Error [512]: Value must be 1 or below
Webmaster has been nodified
E la mail ricevuto dovrebbe contenere:
Error [512]: Value must be 1 or below
$ 1.7. Inviare una E-Mail
Provo ad inviare una mail testmail.php