15 Mar 2011 0 commenti
Non tutti gli errori sono uguali ma tra di loro sussistono differenze a seconda della causa che li ha generati, del momento in cui sono generati e delle conseguenze che da essi derivano. Ogni tipologia è indicata tramite una costante la quale ha un rispettivo valore numerico.
Faccio un premessa che ci aiuterà a comprendere meglio ciò che seguirà. Gli errori sono generati dal server e questi possono verificarsi:
- al momento in cui il file è "interpretato"/"letto" dal server, o meglio dal parse del server; il manuale ufficiale, in inglese, utilizza l'espressione "compile-time" (che tradotta letteralmente significa "al momento della compilazione").
- al momento dell'"esecuzione" del file dal server, cioè quando vengono eseguite (una per una) le istruzioni; il manuale ufficiale, in inglese, utilizza l'espressione "run-time" (che tradotta letteralmente significa "durante l'esecuzione").
Fatta questa premessa possiamo analizzare le diverse tipologie di errore.
PARSE ERROR
E' un errore di sintassi che impedisce l'interpretazione del codice. In altre parole, durante la lettura del codice (compile-time) questo è considerato non intepretabile (dal parse).
Quindi, tutte le istruzioni presenti, precedenti o successive alla riga in cui è presente l'errore, non verranno eseguite.
Esso viene generato, solitamente, quando all'interno del codice è presente un simbolo inatteso (unexpected).
La sua costante è E_ERROR con valore numerico pari a 1.
I casi tipici sono:
- mancanza del punto e virgola dopo un'istruzione;
- una parentesi (graffa o tonda) non chiusa (unexpected $end, unexpected '{', unexpected ')');
- una virgoletta/apice non chiusa;
- una virgoletta/apice interna ad una stringa di cui non è stato operato l'escape (/' /").
FATAL ERROR
E' un errore generato da una specifica istruzione che impedisce la l'intera esecuzione del codice. Esso viene generato durante l'esecuzione (run-time) interrompendola nel punto in cui l'errore si è riscontrato.
Ciò significa che le istruzione precedenti all'errore saranno eseguite, mentre quelle successive verranno ignorate.
Facciamo un esempio:
<?php echo 'Prima istruzione'; // istruzione eseguita $var = not_exists_function(); // fatal error echo 'terza istruzione'; // istruzione che non sarà eseguita ?>
La sua costante è E_PARSE ed ha valore 4.
Fra i più frequenti errori di questa tipologia:
- chiamata di una funzione non esistente e genera un errore del tipo Fatal error: Call to undefined function...; fra le cause frequenti vi è la chiamata di una funzione esistente in versioni successive di php rispetto a quella in uso, oppure una mancata inclusione di un file o, alle volte, dovuta anche ad un (banale) errore di digitazione;
- creazione di una funzione con lo stesso nome di una già esistente e genere un errore del tipo Fatal error: Cannot redeclare..., derivante spesso da duplice inclusione (meglio utilizzare require_once in questi casi);
- legati a memoria insufficiente Fatal error: Allowed memory size of... oppure Fatal error: Out of memory..., causati da limiti di memoria impostati del php.ini (parametro memory_limit) o del server (dovrete rivolgervi all'hosting); tuttavia generalmente questo è un errore derivante da un codice che richiede un carico di lavoro eccessivo e, quindi, bisognerebbe riparare il problema a monte.
WARNING
Non è propriamente un errore ma un avvertimento legato a "problematiche" riscontrate nell'esecuzione di una specifica istruzione. Anche questo, come il precedente, viene generato durante l'esecuzione (run-time) ma in questo caso non si ha l'interruzione dell'esecuzione del codice.
Quindi verranno eseguite tutte le istruzioni sia precedenti sia successive all'istruzione incriminata.
Facciamo un esempio:
<?php echo 'Prima istruzione'; // istruzione eseguita $var = file_get_contents('FileInesistente.txt'); // warning echo 'terza istruzione'; // anche questa istruzione sarà eseguita ?>
La sua costante è E_WARNING ed ha valore numerico pari a 2.
In questo caso è più complesso fase una disamina dei casi tipici data la numerosità. Fra i tantissimi si citeranno solo quelli più frequenti:
- funzione eseguita senza i parametri obbligatori: molte funzioni richiedono obbligatoriamente parametri di un determinato tipo e qualora questi parametri non gli sono passati genera un errore del tipo "Warning nome_funzione() expects exactly 1 parameter, 0 given..." che significa la funzione indicata aspetta 1 parametro e, invece, non gli è stato passato nessuno (0, zero); oppure con logica analoga "Warning nome_funzione() expects at least 3 parameters, 1 given" cioè la funzione aspetta almeno 3 parametri (obbligatori) e gli è stato passato solo 1 parametro.
- funzione eseguita con parametri invalidi: i parametri di ogni funzione devono essere della tipologia consentita e, se sono diversi da questi, genera un errore leggermente diverso da quello visto precedentemente di tipo "Warning nome_funzione() expects parameter 1 to be string, array given..." che sta a dire che la funzione aspetta 1 parametro e questo deve essere una stringa invece gli è stato passato un array; ovviamente l'errore potrà assumere tante declinazioni a seconda della funzione coinvolta.
- file non trovati e/o non accessibili: quasi tutte le funzioni che richiedono come parametro il percorso ad un file (fopen, file_get_contents, include, file, filesize, imagecreateformjpeg e simili, etc etc) in caso di file non trovato o che non ha i dovuti permessi generano un warning di questo tipo "Warning: failed to open stream: No such file or directory in...".
- headers inviati dopo aver già generato output: si determina con le funzioni header, session_start e set_cookie generando un warning di questo tipo "Warning: cannot send header information already sent by...".
Inoltre, essendo che i Warning non determinano l'interruzione del codice possono verificarsi errori "a cascata". L'esempio più classico si ha in caso di errata query rivolta al database attraverso mysql_query (genera un warning) e le successive funzioni (ad esempio mysql_fetch_array, mysql_num_rows, etc.) che richiedono un valido parametro di risorsa (non restiutuito da mysql_query).
NOTICE
I notice sono delle "semplici" notifiche. Essi, analogamente ai warning, sono generati durante l'esecuzione (run-time) e non interrompono l'esecuzione del codice. La sua costante è E_NOTICE ed ha valore 8.
In quanto tali questi non sono giudicati gravi, ma (attenzione) le conseguenze che da essi derivano potrebbero esserle. Giudicarli "errori" dai quali si può soprassedere è sbagliato. Infatti, secondo quanto detto per gli errori "a cascata", un notice apparentemente innocuo può generare errori molto più dannosi. E' opportuno quindi sempre analizarli e prevenirli.
Fra i casi tipici di notice si citerà esclusivamente quello generato in caso di variabili inesistenti:
- se si utilizza una variabile inesistente (o non sempre esistente): questo genera un errore di tipo "Notice: Undefined variable: NomeVariabile..."; ciò può accadere, ad esempio, nei casi in cui l'esistenza della variabile è subordinata al verificarsi di condizioni o all'interazione dell'utente 8caso classico con le variabili $_GET e $_POST).
- una "variante" del precevente errore si ha nel caso si richiami un elemento di un array esistente la cui chiave non esiste: in questi casi l'errore generato è del tipo "Notice: Undefined index: chiave..." se la chiave è di tipo letterale, altrimenti se la chiave è di tipo numerico genera "Notice: Undefined offset: 4..." dove il 4 è la chiave numerica non esistente; ciò accade spesso nel caso di variabili valorizzate direttamente dall'utente (ad esempio via get o via post) o "indirettamente" (ad esempio $_SERVER['HTTP_REFERRER'] o $_SERVER['REMOTE_ADDR']).
DEPRECATED
E' una particolare tipologia di notice. Questo è generato nel caso in cui si utilizzi una funzione o uno specifico parametro di una funzione che, seppur valido e corretto, nelle successive versioni di php rispetto a quella in uso verranno rimosse. In tal caso si parla di funzione deprecata o parametro deprecato.
In passato era un notice a tutti gli effetti ma dalla versione di php 5.3 in poi ha assunto autonoma rilevanza.
Generalmente le funzioni deprecate sono sostituite con altre funzioni. la sua costante è E_DEPRECATED ed ha valore 8192.
Un caso tipico si ha con le funzioni ereg ed eregi (e le loro varianti) che sono state sostituite con le funzioni preg (nelle sue varianti).
STRICT
Questi non sono errori sotto nessun punto di vista ma cono dei consigli (suggerimenti di modifica o settaggio) che php ci fornisce per dare al codice maggiore interoperabilità e compatibilità. In passato rientravano nell'ambito dei notice ma da php 5 in avanti hanno autonoma rilevanza.
La sua costante è E_STRICT con valore numerico pari a 2048.
E_ALL
E_ALL è la costante che indica tutti gli errori di qualsiasi tipologia esclusi quelli di tipo strict. Il suo valore numerico è stato modificato nelle diverse versioni di php. Nella veriosne 5.3 corrisponde a 30719.
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED
Queste costanti fanno riferimento ad errori che sono del tutto assimilabili a quelli precedentemente elencati per ciò che riguarda le conseguenze (interruzione o meno dell'esecuzione del codice). Questi errori sono generati dalle funzioni personalizzate che andremo a realizzare attraverso la funzione trigger_error(). Ne riporto di seguito un esempio:
function test_funzione($array_argument) { if(!is_array($array_argument)) { trigger_error("la funzione si aspetta un array", E_USER_ERROR); } return $array_argument; } $string = 'string'; test_funzione($string); echo 'altra istruzione'; // non sarà eseguita dato E_ERROR precedente
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.