English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base PHP

Tutorial avanzato PHP

PHP & MySQL

Manuale di riferimento PHP

Gestione degli errori PHP

In questo tutorial, imparerai come utilizzare le funzionalità di gestione degli errori di PHP per gestire agevolmente le situazioni di errore.

Gestire gli errori

A volte, la tua applicazione potrebbe non funzionare correttamente, causando errori. Ci sono molti motivi che possono causare errori, ad esempio:

  • Il server web potrebbe avere spazio su disco insufficiente

  • L'utente potrebbe aver inserito un valore non valido nel campo del modulo

  • Il file o il record del database che stai cercando di accedere potrebbe non esistere

  • L'applicazione potrebbe non avere i permessi di scrittura sui file sul disco

  • Il servizio che l'applicazione deve accedere potrebbe essere temporaneamente non disponibile

Questi tipi di errori vengono chiamati errori in tempo di esecuzione perché si verificano durante l'esecuzione dello script. Differiscono dagli errori di sintassi che devono essere corretti prima della esecuzione dello script.

Le applicazioni professionali devono avere funzionalità appropriate per gestire tali errori in tempo di esecuzione. Di solito, questo significa informare chiaramente e accuratamente l'utente di ciò che è successo.

Capire i livelli di errore

Di solito, quando si verifica un problema che impedisce al script di funzionare correttamente, il motore PHP attiva un errore. Ogni errore è rappresentato da un valore numerico e da una costante associata. La tabella seguente elenca alcuni livelli di errore comuni:

Livello di erroreValoreDescrizione
E_ERROR1

Errore in tempo di esecuzione fatale, non ripristinabile. L'esecuzione dello script viene interrotta immediatamente.

E_WARNING2

Avviso in tempo di esecuzione. Non è fatale, la maggior parte degli errori appartiene a questa categoria. L'esecuzione dello script non viene interrotta.

E_NOTICE8

Notifica in tempo di esecuzione. Indica che lo script ha incontrato una situazione che potrebbe causare un errore, anche se potrebbe accadere durante l'esecuzione normale dello script.

E_USER_ERROR256

Messaggio di errore fatale generato dall'utente. È simile a E_ERROR, ma è generato dallo script PHP utilizzando la funzione trigger_error() piuttosto che dal motore PHP.

E_USER_WARNING512Avviso generato dall'utente non fatale. È simile a E_WARNING, ma è generato dallo script PHP utilizzando la funzione trigger_error() piuttosto che dal motore PHP.
E_USER_NOTICE1024

Messaggio di notifica generato dall'utente. È simile a E_NOTICE, ma è generato dallo script PHP utilizzando la funzione trigger_error() piuttosto che dal motore PHP.

E_STRICT2048

In senso stretto non è un errore, ma PHP attiva quando incontra codice che potrebbe causare problemi o incompatibilità non retroattiva.

E_ALL8191

tutti gli errori e gli avvisi, esclusi E_STRICT prima di PHP 5.4.0.

Per ulteriori livelli di errore, consultaLivelli di errore PHPdi riferimento.

Ogni volta che uno script PHP incontra un problema, il motore PHP attiva un errore, ma puoi anche attivare tu stesso un errore per generare messaggi di errore più amichevoli per l'utente. In questo modo, puoi rendere l'applicazione più complessa. Di seguito vengono descritte alcune delle metodologie comuni per la gestione degli errori PHP:

Gestione degli errori di base con la funzione die()

Considera l'esempio seguente, che tenta solo di aprire un file di testo in modalità di sola lettura.

<?php
// Tentativo di aprire un file non esistente
$file = fopen("sample.txt", "r");
?>

Se il file non esiste, potresti ricevere l'errore seguente:

Attenzione: fopen(sample.txt) [funzione.fopen]: impossibile aprire lo stream: File o directory non trovato in C:\wamp\www\project\test.php alla riga 2

Seguendo alcuni semplici passaggi, possiamo prevenire che l'utente riceva messaggi di errore di questo tipo.

<?php
if(file_exists("sample.txt")){
    $file = fopen("sample.txt", "r");
} else {
    die("Errore: Il file che stai cercando di accedere non esiste.");
}
?>

Ora, se esegui lo script sopra riportato, riceverai il seguente messaggio di errore:

Errore: Il file che stai cercando di accedere non esiste.

Come puoi vedere, attraverso la realizzazione di semplici controlli sulla presenza del file prima di tentare di accedervi, possiamo generare messaggi di errore più significativi per l'utente.

Se non viene trovato il file "sample.txt", la funzione die() utilizzata sopra mostrerà solo un messaggio di errore personalizzato e terminerà lo script corrente.

Creare una funzione di gestione degli errori personalizzata

Puoi creare la tua funzione di gestione degli errori per gestire gli errori di runtime generati dal motore PHP. Il programma di gestione degli errori personalizzato ti offre una maggiore flessibilità e un migliore controllo sugli errori, può controllare gli errori e decidere come gestirli, può mostrare un messaggio all'utente, registrare l'errore in un file o un database o inviarlo via email, cercare di risolvere il problema e continuare, uscire dall'esecuzione dello script o ignorare completamente l'errore.
La funzione di gestione degli errori personalizzata deve essere in grado di gestire almeno due parametri (errno e errstr), ma può accettare ulteriori tre parametri (errfile, errline e errcontext), come descritto di seguito:

ParametroDescrizione
Obbligatorio - I seguenti parametri sono obbligatori
errnoSpecificare il livello di errore come intero. Questo corrisponde ai costanti di livello di errore appropriati (E_ERROR, E_WARNING, ecc.)
errstrSpecificare il messaggio di errore come stringa
Opzionale - I seguenti parametri sono opzionali
errfileSpecificare il nome del file dello script che ha causato l'errore come stringa
errlineSpecificare il numero di riga dell'errore come stringa
errcontextSpecificare un array che contiene tutte le variabili esistenti e i loro valori quando si verifica un errore. Utile per il debug

Ecco un esempio di funzione di gestione degli errori personalizzata semplice. Qualsiasi errore, anche il più insignificante, scatena questo gestore customError(). Poi, stampa i dettagli dell'errore nel browser e ferma l'esecuzione dello script.

<?php
//Funzione di gestione degli errori
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
?>

Devi dire a PHP di utilizzare la tua funzione di gestione degli errori personalizzata - chiama semplicemente la funzione built-in set_error_handler() e passa il nome della funzione.

<?php
//Funzione di gestione degli errori
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
 
//Impostare il gestore degli errori
set_error_handler("customError");
 
//Eseguire un errore
echo($test);
?>

Registro degli errori

Registrare messaggi di errore in un file di testo

Puoi anche registrare i dettagli dell'errore nel file di log, come indicato di seguito:

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("calcDivision(): il divisore non può essere zero", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message = "Errore: [" . $errno . "] - " . "$errstr in $errfile alla riga $errline;"
    $message .= "Variabili:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "logs/app_errors.log");
    die("Si è verificato un problema, riprova.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "Questo non verrà stampato mai.";
?>

Inviare messaggi di errore tramite email

Puoi anche inviare una email con dettagli dell'errore utilizzando la funzione error_log().

<?php
function calcDivision($dividend, $divisor) {
    if ($divisor == 0){
        trigger_error("calcDivision(): il divisore non può essere zero", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message = "Errore: [" . $errno . "] - " . "$errstr in $errfile alla riga $errline;"
    $message .= "Variabili:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "[email protected]");
    die("Si è verificato un problema, riprovate. Il rapporto di errore è stato inviato all'amministratore del sito.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "Questo non verrà stampato mai.";
?>

Generare errore

Nonostante il motore PHP generi errori quando si incontrano problemi nello script, è anche possibile generare errori manualmente. Questo può rendere la vostra applicazione più robusta, poiché può segnalare potenziali problemi prima che diventino errori gravi.

Per generare un errore all'interno dello script, chiamare la funzione trigger_error() e passare il messaggio di errore da generare:

trigger_error("Si è verificato un problema.");

Consideriamo una funzione che calcola la divisione di due numeri.

<?php
function calcDivision($dividend, $divisor) {
    return($dividend / $divisor);
}
 
//Chiamata alla funzione
echo calcDivision(10, 0);
?>

Se si passa come parametro zero a $divisor, il messaggio di errore generato dal motore PHP sarà simile al seguente:

Attenzione: Divisione per zero in C:\wamp\www\project\test.php alla riga 3

Questa messaggio sembra contenere poco. Vediamo un esempio di come generare un errore utilizzando la funzione trigger_error().

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("Il divisore non può essere zero", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
 
//Chiamata alla funzione
echo calcDivision(10, 0);
?>

Ora, lo script genera questo messaggio di errore:

Attenzione: Il divisore non può essere zero in C:\wamp\www\project\error.php alla riga 4  	

Come vedete, il messaggio di errore generato dal secondo esempio è più chiaro rispetto a quello del primo esempio, spiegando il problema.