0 commenti php

La funzione set_error_handler ci permette di personalizzare la "reazione" che php produce al verificarsi di un errore.

Di default tale reazione è prodotta dal gestore degli errori di php e, come ben sappiamo, consisterà nella stampa a video dei seguenti dati:

  • il tipo di errore: PARSE ERROR, FATAL ERROR, WARNING, NOTICE, DEPRECATED o STRICT; ognuno di questi errori è contraddistinto da una costante con valore numerico; per maggiori dettagli si rimanda ad un precedente articolo o al manuale ufficiale.
  • il motivo: cioè una stringa che descrive sinteticamente i motivi per il quale si è verificato l'errore;
  • il file in cui è presente l'errore;
  • la riga del file in cui è presente l'errore. 

 

Con la funzione set_error_handler potremo impostare una funzione personalizzata che definirà il modo in cui vogliamo gestire degli errori. Se di default si ha la stampa a video, con la funzione personalizzata impostata come parametro di set_error_handler potremo, al contrario, prevedere che al verificarsi di un errore questo venga salvato nel database e/o ci venga notificato tramite email. Vediamo come procedere così sarà tutto più chiaro.

 

Occorrerà anzitutto definire la nostra funzione personalizzata per la gestione degli errori. Chiamiamola, ad esempio, My_Custom_errors()

Essa avrà almeno 2 parametri obbligatori, mentre gli ulteriori 3 parametri sono facoltativi. In questa guida descriveremo il settaggio con 4 parametri (quello tradizionale):

  1. il primo parametro accetterà un numero corrispondente al livello di errore che si è generato (per maggiori dettagli si rimanda ad un precedente articolo e al manuale ufficiale).
  2. il secondo conterrà una stringa che descriverà l'errore.
  3. il terzo conterrà una stringa indicante il percorso al file che ha generato l'errore.
  4. il quarto parametro conterrà un numero intero corrispondente al rigo in cui si è verificato l'errore.

Vediamola all'opera con un semplice esempio:

<?php
// impostiamo la rilevazione di tutti gli errori
error_reporting(E_ALL | E_STRICT);

// creiamo la nostra funzione di gestore degli errori
function My_Custom_Errors($livello, $descrizione, $file, $riga)
	{
	switch($livello)
		{
        case E_ERROR:               $tipologia =  "Error";                  break;
        case E_PARSE:               $tipologia =  "Parse Error";            break;
        case E_WARNING:             $tipologia =  "Warning";                break;
        case E_DEPRECATED:          $tipologia =  "Deprecated";             break;
        case E_NOTICE:              $tipologia =  "Notice";                 break;
        case E_CORE_ERROR:          $tipologia =  "Core Error";             break;
        case E_CORE_WARNING:        $tipologia =  "Core Warning";           break;
        case E_COMPILE_ERROR:       $tipologia =  "Compile Error";          break;
        case E_COMPILE_WARNING:     $tipologia =  "Compile Warning";        break;
        case E_USER_ERROR:          $tipologia =  "User Error";             break;
        case E_USER_WARNING:        $tipologia =  "User Warning";           break;
        case E_USER_NOTICE:         $tipologia =  "User Notice";            break;
        case E_STRICT:              $tipologia =  "Strict Notice";          break;
        case E_RECOVERABLE_ERROR:   $tipologia =  "Recoverable Error";      break;
        default:                    $tipologia =  "Unknown error ($livello)"; break;
		}
	echo "<p>
		<strong>Errore di tipo</strong>: ".$tipologia."<br />
		<strong>Descrizione errore</strong>: ".$descrizione."<br />
		<strong>File in cui è presente l'errore</strong>: ".$file."<br />
		<strong>Riga in cui è presente l'errore</strong>: ".$riga."
		</p>";
	}

// impostiamo il gestore degli errori con set_error_handler
set_error_handler("My_Custom_Errors");

// commettiamo volontariamente una serie di errori
function change (&$num) {$num += 10;}  
$num = 1;  
  
change(++$num); // strict  
ereg('z', 'xyz'); // deprecated  
$var .=''; // notice  
file('not_extists.txt'); // warning  
not_exists_function(); // fatal error 
?>

 

In questo semplice esempio ho impostato come "reazione" all'avvenuto errore la stampa a video tramite il comando echo con una formattazione personalizzata. Ebbene in realtà potrete modificare la funzione My_Custom_Errors() e prevedere, ad esempio, che vi invii una email:

function My_Custom_Errors($livello, $descrizione, $file, $riga)
	{
	switch($livello)
		{
        case E_ERROR:               $tipologia =  "Error";                  break;
        case E_PARSE:               $tipologia =  "Parse Error";            break;
        case E_WARNING:             $tipologia =  "Warning";                break;
        case E_DEPRECATED:          $tipologia =  "Deprecated";             break;
        case E_NOTICE:              $tipologia =  "Notice";                 break;
        case E_CORE_ERROR:          $tipologia =  "Core Error";             break;
        case E_CORE_WARNING:        $tipologia =  "Core Warning";           break;
        case E_COMPILE_ERROR:       $tipologia =  "Compile Error";          break;
        case E_COMPILE_WARNING:     $tipologia =  "Compile Warning";        break;
        case E_USER_ERROR:          $tipologia =  "User Error";             break;
        case E_USER_WARNING:        $tipologia =  "User Warning";           break;
        case E_USER_NOTICE:         $tipologia =  "User Notice";            break;
        case E_STRICT:              $tipologia =  "Strict Notice";          break;
        case E_RECOVERABLE_ERROR:   $tipologia =  "Recoverable Error";      break;
        default:                    $tipologia =  "Unknown error ($livello)"; break;
		}
		
	$testo_email = "
		<html>
		<body>
		<p>
		<strong>Errore di tipo</strong>: ".$tipologia."<br />
		<strong>Descrizione errore</strong>: ".$descrizione."<br />
		<strong>File in cui è presente l'errore</strong>: ".$file."<br />
		<strong>Riga in cui è presente l'errore</strong>: ".$riga."
		</p>
		</body>
		</html>
		";
	
	$header = "MIME-Version: 1.0rn";  
	$header .= "Content-type: text/html; charset=iso-8859-1rn";  
	
	$oggetto = "Errore nel sito";
	$destinatario = "admin@dominio.it";
	@mail($destinatario, $oggetto, $testo_email, $header);
	}

 

Tengo ad evidenziare un aspetto: settando l'error_reporting si sceglie quali errori siano rilevati e, conseguentemente, venga eseguito il gestore degli errori (quello di default o quello personalizzato con set_error_handler). Quindi se, ad esempio, settiamo un error_reporting tale che non vengano rilevati gli errori di tipo notice, si avrà che neanche il gestore degli errori verrà eseguito in caso di tale genere di errore.

 

Per ulteriori dettagli sulla funzionse set_error_handler rimando al manuale ufficiale.

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

0 Commenti presenti