Gestione degli errori PHP: die () Vs trigger_error () Vs throw Eccezione


119

Per quanto riguarda la gestione degli errori in PHP - Per quanto ne so ci sono 3 stili:

  1. die()o exit()stile:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
  2. throw Exception stile:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
  3. trigger_error() stile:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }

Ora, nel manuale PHP vengono utilizzati tutti e tre i metodi.

  • Quello che voglio sapere è quale stile dovrei preferire e perché?

  • Queste 3 sostituzioni l'una dell'altra e quindi possono essere utilizzate in modo intercambiabile?

Leggermente OT: Sono solo io o tutti pensano che le opzioni di gestione degli errori PHP siano troppe nella misura in cui confonde gli sviluppatori PHP?


4
Questi non sono "stili". Sono caratteristiche linguistiche diverse. Per scopi diversi.
mario

11
@mario: quali sono i diversi scopi rientrati ? Per favore, illuminami :)
CuriousMind

Hai posto la domanda in modo eccellente. grazie per aver chiesto
Accountant م

Risposte:


86

Il primo non dovrebbe mai essere utilizzato nel codice di produzione, poiché sta trasportando informazioni irrilevanti per gli utenti finali (un utente non può fare nulla per "Impossibile connettersi al database" ).

Si generano eccezioni se si sa che in un determinato punto di codice critico, l'applicazione può non riuscire e si desidera che il codice venga ripristinato su più livelli di chiamata.

trigger_error()ti consente di segnalare gli errori in modo dettagliato (utilizzando diversi livelli di messaggi di errore) e puoi nascondere tali errori agli utenti finali (utilizzando set_error_handler()) ma visualizzarli durante il test.

Inoltre trigger_error()può produrre messaggi non irreversibili importanti durante lo sviluppo che possono essere soppressi nel codice di produzione utilizzando un gestore di errori personalizzato. Puoi anche produrre errori fatali ( E_USER_ERROR) ma questi non sono recuperabili. Se si attiva uno di questi, l'esecuzione del programma si interrompe a quel punto. Questo è il motivo per cui, in caso di errori irreversibili, è necessario utilizzare le eccezioni. In questo modo, avrai un maggiore controllo sul flusso del tuo programma:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

Qui, se gather_data()semplicemente gracchiando (usando E_USER_ERRORo die()) c'è una possibilità, le INSERTdichiarazioni precedenti sarebbero entrate nel tuo database, anche se non lo desideri e non avresti alcun controllo su ciò che accadrà dopo.


2
quindi fuori trigger_error()e lanciare eccezioni: quale dovrei usare e quando?
CuriousMind

@Gaurish Vedi l'esempio aggiunto su questo.
Linus Kleen

2
Dopo aver letto il tuo esempio, penso di aver capito meglio lo scopo dietro l'eccezione di lancio. Grazie :)
CuriousMind

1
@Pacerier Dipende dalla configurazione del server, in realtà. Un sistema potrebbe essere configurato per autocommit per impostazione predefinita, da cui l'esplicito ROLLBACK. Questo esempio di pseudo-codice copre entrambi i casi: i server che non sono configurati per l'autocommit (l' COMMITistruzione è richiesta) e quelli che lo fanno.
Linus Kleen

1
@LinusKleen, l'autocommit non è disattivato una volta eseguita la linea query('START TRANSACTION');?
Pacerier

10

Di solito utilizzo il primo modo per il debug semplice nel codice di sviluppo. Non è consigliato per la produzione. Il modo migliore è lanciare un'eccezione, che puoi catturare in altre parti del programma e fare un po 'di gestione degli errori.

I tre stili non si sostituiscono a vicenda. Il primo non è affatto un errore, ma solo un modo per interrompere lo script e visualizzare alcune informazioni di debug da analizzare manualmente. Il secondo non è un errore di per sé, ma verrà convertito in un errore se non lo prendi. L'ultimo sta innescando un vero e proprio errore nel motore PHP che verrà gestito in base alla configurazione del proprio ambiente PHP (in alcuni casi mostrato all'utente, in altri casi solo loggato in un file o non salvato affatto).


1
Cosa succede quando viene lanciata un'eccezione ma non viene rilevata? provocherà un errore fatale, immagino. E con la trigger_error()stessa cosa accade. quindi qual è la differenza?
CuriousMind

4
La differenza è che puoi catturare l'eccezione e gestirla nel modo che preferisci.
Emil Vikström
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.