ErrorReporting

Da Php-faq.org.

error_reporting è la direttiva che imposta il livello di notifica degli errori PHP.

Indice

[modifica] Come si usa?

Può essere settata direttamente nel file php.ini (se si ha accesso al server), nel file .htaccess, oppure via codice, usando la funzione ini_set() o la funzione error_reporting(). Se viene settata da codice, il nuovo valore impostato sarà valido solo fino alla fine dello script (oppure fino a nuova modifica).

[modifica] Quante categorie di errori esistono in PHP?

Esistono principalmente quattro categorie di errori in PHP.

  • E_ERROR. Gli errori fatali, che interrompono l'esecuzione dello script perché per la loro natura non è possibile continuarla.
  • E_WARNING. I warning, che non interrompono l'esecuzione dello script, ma che possono compromettere il suo funzionamento e quindi possono comportare perfino una perdita di dati.
  • E_NOTICE. I notice, che non interrompono l'esecuzione dello script, che possono comunque compromettere il suo funzionamento, ma possono anche essere innocui.
  • E_STRICT. Le imperfezioni, che non interrompono l'esecuzione dello script, ma che sono di grande aiuto se si vuole imparare a programmare come si deve, evitando, ad esempio, di usare funzioni ormai deprecate e che un giorno potrebbero non esistere più nel linguaggio.

Esistono altre categorie di errori (per una lista completa, fare riferimento al manuale) e la costante E_ALL li comprende tutti in PHP6 (fino a PHP5, E_ALL comprende tutte le categorie di errori eccetto E_STRICT).

[modifica] Com'è impostato di default?

Di norma, in PHP6 è impostato a E_ALL, mentre in PHP4 e PHP5 è impostato a E_ALL & ~E_NOTICE.

Chi non conosce gli operatori binari e in generale le bitmask, sappia che può vedere la '&' come ad un 'AND' ('e') e la '~' come ad un 'NOT' ('non').

Quindi di norma in PHP4 e PHP5 vengono segnalati tutti gli errori eccetto le imperfezioni (E_ALL non contiene E_STRICT), e vengono poi esclusi i notice (E_NOTICE).

[modifica] Come impostarlo in fase di sviluppo?

In fase di sviluppo, il consiglio è quello di impostare l'error_reporting a E_ALL se si usa PHP6. Se si usa una versione inferiore di PHP, il consiglio è quello di impostarlo a E_ALL | E_STRICT.

Dunque, se si ha accesso al file php.ini, si può impostare la direttiva in questo modo:

	error_reporting = E_ALL | E_STRICT

Se invece non si ha accesso al file php.ini, si può inserire, prima dell'esecuzione della prima istruzione PHP, la seguente linea di codice:

	ini_set ('error_reporting', E_ALL ); // PHP6
	ini_set ('error_reporting', E_ALL | E_STRICT); // PHP4 e PHP5

In alternativa, è presente la funzione php.net/error_reporting, e quindi il codice diventa:

	error_reporting (E_ALL); // PHP6
	error_reporting (E_ALL | E_STRICT); // PHP4 e PHP5

[modifica] Come impostarlo in fase di produzione?

Per la fase di produzione, è consigliabile disabilitare la visualizzazione degli errori, mantenendo però un elevato livello di logging.

Impostando le direttive display_errors e display_startup_errors ad off è possibile disabilitare la visualizzazione degli errori. Impostando la direttiva log_errors ad on, invece, gli errori verranno loggati (nel file error.log, se non è stata impostata la direttiva error_log). Di norma, gli errori vengono già anche loggati.

Da notare è anche il fatto che in produzione l'error reporting è bene che sia settato direttamente nel file di configurazione di php, poiché in caso di errori fatali qualsiasi modifica al settaggio negli script non viene apportata con successo.

[modifica] Come lo imposto tramite il file .htaccess?

In questo caso, sarà necessario utilizzare il valore numerico al posto delle costanti. Essendo per alcune costanti (ad es. E_ALL) tale valore numerico variabile nel tempo (ad es. perché vengono aggiunte nuove costanti), bisogna utilizzare la funzione get_defined_constants() per conoscere il valore numerico delle costanti usate sul server. Questa è la lista più aggiornata (PHP6):

	[E_ERROR]              =>     1
	[E_WARNING]            =>     2
	[E_PARSE]              =>     4
	[E_NOTICE]             =>     8
	[E_CORE_ERROR]         =>    16
	[E_CORE_WARNING]       =>    32
	[E_COMPILE_ERROR]      =>    64
	[E_COMPILE_WARNING]    =>   128
	[E_USER_ERROR]         =>   256
	[E_USER_WARNING]       =>   512
	[E_USER_NOTICE]        =>  1024
	[E_STRICT]             =>  2048
	[E_RECOVERABLE_ERROR]  =>  4096
	[E_ALL]                =>  8191

Il valore numerico può essere usato anche nel php.ini, con ini_set() o con error_reporting().

[modifica] Come posso visualizzare tutte le categorie di errori?

Per esser sempre certi di poter vedere tutti gli errori, e quindi di produrre codice migliore, il consiglio, anche in prospettiva futura, è di impostarlo al valore intero più alto possibile, in questo modo:

	error_reporting (2147483647); // in case of 32 bit architectures

In questo modo, saremo sicuri che tutti gli errori saranno visualizzati, e anche se ciò comporterà più tempo per correggere il nostro codice, ci darà senza dubbio un codice scritto meglio e quindi più robusto in fase di produzione.

[modifica] Come posso scoprire quale error reporting è in uso in un dato momento?

Tramite la stessa funzione error_reporting() è possibile ottenere il valore corrente in uso senza modificarlo (a patto che non gli siano passati valori, nemmeno uno `0`).

    echo $err_rep = error_reporting();

Se si vuole anche visualizzare un qualcosa di più leggibile, un codice come questo può risultare utile (con le dovute modifiche nel tempo):

$err_rep = error_reporting();

$err_list = array(
'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING',
'E_USER_ERROR', 'E_USER_WARNING',
'E_USER_NOTICE', 'E_STRICT', 'E_RECOVERABLE_ERROR');

for ($i = 0; $i <= count($err_list) - 1; $i++)
{
    if ($err_rep & (1 << $i)) {
        echo "{$err_list[$i]} \n";
    }
}
Strumenti personali