Il logo del sito

Appunti su PHP

Traduzione da PHP Error handling

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:

$ 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_levelRichiesto. Specifica l'error report level. Deve essere un numero. Vedi la tabella seguente.
error_messageRichiesto. Specifica il messaggio d'errore.
error_fileOpzionale. Specifica il nome del file in cui si è verificato l'errore.
error_lineOpzionale. Specifica il numero di linea in cui si è verificato l'errore.
error_contextOpzionale. Specifica un array contente ogni variabile, ed il loro valore, in uso quando si è verificato l'errore.
Error Report Level
Valore Costante Descrizione
2E_WARNINGErrore a run-time non fatale. L'esecuzione dello script non viene interrotta.
8E_NOTICEInformazione. Lo script ha trovato qualcosa che potrebbe essere un errore, ma che potrebbe anche verificarsi durante la normale esecuzione.
256E_USER_ERRORFatale, generato dall'utente. Questo è come un E_ERROR settato dal programmatore con la funzione trigger_error().
512E_USER_WARNINGNon fatale. Questo è come un E_WARNING settato dal programmatore con la funzione trigger_error().
1024E_USER_NOTICEInformazione. Questo è come un E_NOTICE settato dal programmatore con la funzione trigger_error().
4096E_RECOVERABLE_ERRORErrore fatale catturabile. Questo è come un E_ERROR ma può essere catturato da un handler definito dall'utente (vedi la funzione set_error_handler())
8191E_ALLTutti 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);
?>
Error: [8] Undefined variable: 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");
   }
?>
Error: [1024] 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:

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.

Error: [512] Value must be 1 or below
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);
   }
?>
Error: [512] Value must be 1 or below
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