PHP Fehlerbehandlung: die () Vs trigger_error () Vs throw Exception

118

In Bezug auf die Fehlerbehandlung in PHP - Soweit ich weiß, gibt es 3 Stile:

  1. die()oder exit()Stil:

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

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

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

Jetzt werden im PHP-Handbuch alle drei Methoden verwendet.

  • Ich möchte wissen, welchen Stil ich bevorzugen soll und warum?

  • Sind diese 3 Tropfen voneinander zu ersetzen und können daher austauschbar verwendet werden?

Etwas OT: Ist es nur ich oder jeder denkt, dass PHP-Fehlerbehandlungsoptionen einfach zu viele sind, um PHP-Entwickler zu verwirren?

CuriousMind
quelle
4
Dies sind keine "Stile". Sie sind verschiedene Sprachmerkmale. Für verschiedene Zwecke.
Mario
11
@mario: Was sind verschiedene eingerückte Zwecke ? Bitte
klären
Sie haben die Frage großartig gestellt. danke für die Frage
Buchhalter م

Antworten:

85

Der erste sollte niemals im Produktionscode verwendet werden, da er Informationen transportiert, die für Endbenutzer irrelevant sind (ein Benutzer kann nichts gegen "Keine Verbindung zur Datenbank möglich" tun ).

Sie lösen Ausnahmen aus, wenn Sie wissen, dass Ihre Anwendung an einem bestimmten kritischen Codepunkt fehlschlagen kann und Sie möchten, dass Ihr Code über mehrere Aufrufebenen hinweg wiederhergestellt wird.

trigger_error()Mit dieser Funktion können Sie fehlerhafte Fehlerberichte erstellen (mithilfe verschiedener Ebenen von Fehlermeldungen) und diese Fehler vor Endbenutzern ausblenden (mithilfe von set_error_handler()), die Ihnen jedoch während des Tests angezeigt werden.

Auch trigger_error()kann nicht-tödliche Nachrichten erzeugen wichtig bei der Entwicklung , die in der Produktion Code unterdrückt werden kann einen benutzerdefinierten Fehlerhandler verwenden. Sie können auch schwerwiegende Fehler verursachen ( E_USER_ERROR), die jedoch nicht wiederhergestellt werden können. Wenn Sie einer von denen auslösen, die Programmausführung stoppt an diesem Punkt. Aus diesem Grund sollten für schwerwiegende Fehler Ausnahmen verwendet werden. Auf diese Weise haben Sie mehr Kontrolle über den Ablauf Ihres Programms:

// 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');
}

Wenn hier gather_data()nur krächzend (mit E_USER_ERRORoder die()) eine Chance besteht, hätten frühere INSERTAussagen es in Ihre Datenbank geschafft, selbst wenn dies nicht gewünscht wäre, und Sie hätten keine Kontrolle darüber, was als nächstes passieren soll.

Linus Kleen
quelle
2
Also aus trigger_error()& werfen Ausnahmen: Welche soll ich verwenden & wann?
CuriousMind
@Gaurish Siehe das hinzugefügte Beispiel dazu.
Linus Kleen
2
Nachdem ich Ihr Beispiel gelesen habe, denke ich, dass ich jetzt den Zweck der Wurfausnahme besser verstehe. Danke :)
CuriousMind
1
@Pacerier Das hängt eigentlich von der Konfiguration des Servers ab. Ein System ist möglicherweise standardmäßig so konfiguriert, dass es automatisch festschreibt, daher das explizite ROLLBACK. Dieses Pseudocode-Beispiel deckt beide Fälle ab: Server, die nicht für die automatische Festschreibung konfiguriert sind (die COMMITAnweisung ist erforderlich), und solche, die dies tun.
Linus Kleen
1
@LinusKleen, ist die automatische Festschreibung nicht deaktiviert, sobald wir die Leitung laufen lassen query('START TRANSACTION');?
Pacerier
10

Normalerweise verwende ich den ersten Weg zum einfachen Debuggen im Entwicklungscode. Es wird nicht für die Produktion empfohlen. Der beste Weg ist, eine Ausnahme auszulösen, die Sie in anderen Teilen des Programms abfangen und Fehler behandeln können.

Die drei Stile sind keine Drop-In-Ersetzungen für einander. Der erste ist überhaupt kein Fehler, sondern nur eine Möglichkeit, das Skript zu stoppen und einige Debugging-Informationen auszugeben, die Sie manuell analysieren können. Der zweite ist an sich kein Fehler, sondern wird in einen Fehler umgewandelt, wenn Sie ihn nicht abfangen. Der letzte löst einen echten Fehler in der PHP-Engine aus, der entsprechend der Konfiguration Ihrer PHP-Umgebung behandelt wird (in einigen Fällen dem Benutzer angezeigt, in anderen Fällen nur in einer Datei protokolliert oder überhaupt nicht gespeichert).

Emil Vikström
quelle
1
Was passiert, wenn eine Ausnahme ausgelöst, aber nicht abgefangen wird? Es wird einen schwerwiegenden Fehler verursachen, denke ich. Und mit dem trigger_error()gleichen passiert. Was ist der Unterschied?
CuriousMind
4
Der Unterschied besteht darin, dass Sie die Ausnahme abfangen und nach Belieben behandeln können.
Emil Vikström