Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der globalen Fehlerbehandlung in PHP

Detaillierte Erklärung der globalen Fehlerbehandlung in PHP

怪我咯
怪我咯Original
2017-07-07 10:22:041405Durchsuche

PHP verfügt über ein eigenes try{throw{}}catch{}-Ausnahme-/Fehlerabfangsystem, das in einer Produktionsumgebung schwer zu verwenden ist. In einer Produktionsumgebung verlangen wir im Allgemeinen, dass PHP sofort reagiert, sobald eine Ausnahme/ein Fehler auftritt beendet das Skript und zeigt es dem Besucher an. Der Server gibt eine Fehlermeldung aus und sendet eine Nachricht an den Administrator über benutzerdefinierte Funktion

Zweck dieses Artikels

Global of PHP Error Handling ist bei der Entwicklung von Projekten sehr nützlich. Es kann Entwicklern helfen, einige Probleme schnell zu lokalisieren und die Arbeitseffizienz zu verbessern. Standardmäßig werden globale Fehler direkt ausgegeben, aber eine kürzlich während der Entwicklung verwendete Framework-Bibliothek hat eine globale Fehlerbehandlung festgelegt, was dazu führt, dass viele Fehlermeldungen nicht ausgegeben werden und es zeitaufwändig ist, Probleme zu lokalisieren. Deshalb habe ich die Implementierung dieser Bibliothek untersucht und festgestellt, dass sie error_reporting und set_error_handler setzt, was dieses Phänomen verursacht. Notieren Sie nun die Verwendung dieser beiden Funktionen als Memo.

Hintergrund

PHP verfügt nicht über eine Typerkennung. Es ist für Entwickler einfacher, falsche Wörter einzugeben, was zu schwerwiegenden Fehlern und schließlich dazu führt, dass das Skript nicht mehr ausgeführt wird. Wenn Sie zu diesem Zeitpunkt keine Fehlermeldung erhalten, wird es sehr schmerzhaft sein. Sie müssen mit dem Debuggen ab der ersten Codezeile im Skript beginnen und Tausende von Codezeilen weiter ausdrucken oder wiederholen, bis Sie das falsch geschriebene Wort gefunden haben. Dann müssen Sie zurückgehen und alle zuvor hinzugefügten Abdrücke oder Echos löschen. Das ist ein extrem langweiliger Job.

Allgemeine Situation

Unter normalen Umständen gibt PHP den schwerwiegenden Fehler direkt aus und gibt die Fehlerquelle (Dateiadresse, Zeilennummer) und den Grund usw. aus ., sodass Entwickler Probleme leicht lokalisieren können.

Aber manchmal werden diese Informationen aufgrund von php.ini-Einstellungen oder Problemen mit der Framework-Konfiguration von Drittanbietern nicht ausgegeben. Zu diesem Zeitpunkt müssen Sie lernen, relevante Parameter selbst festzulegen und diese Fehlermeldungen schnell zu finden Probleme.

error_reporting

error_reporting ist ein globaler PHP-Konfigurationsparameter in php.ini. Dient zum Konfigurieren der Fehlerausgabestufe. Die Parameter sind Bits, mit denen die Fehlerausgabestufe festgelegt werden kann. Die folgenden Informationen werden aus php.ini kopiert:

; error_reporting is a bit-field. Or each number up to get desired error
; reporting level
; E_ALL - All errors and warnings (doesn't include E_STRICT)
; E_ERROR - fatal run-time errors
; E_RECOVERABLE_ERROR - almost fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it's automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
; and forward compatibility of your code
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
;
; Examples:
;
; - Show all errors, except for notices and coding standards warnings
;
;error_reporting = E_ALL & ~E_NOTICE
;
; - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
;
; - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
;
; - Show all errors except for notices and coding standards warnings
;
error_reporting = E_ALL & ~E_NOTICE


Standardmäßig gibt PHP alle Fehlermeldungen außer Hinweisen aus. Ebenso stellt die PHP-Standardfunktion die gleichnamige Funktion error_reporting(int $level) bereit, die zur Ausführung derselben Funktion in PHP-Skripten verwendet wird. Dies hat keine Auswirkungen auf andere Programme. Es ist zu beachten, dass die Fehlerausgabe deaktiviert ist, wenn $level 0 ist, d. h. es werden keine Fehler ausgegeben.

set_error_handler

PHPs standardmäßige Fehlerbehandlung besteht darin, die Nachricht auszugeben. Manchmal müssen Sie jedoch andere Vorgänge definieren. In diesem Fall müssen Sie die Fehlerbehandlungsfunktion anpassen. PHP bietet die integrierte Funktion set_error_handler, die uns bei der Registrierung unserer eigenen Fehlerbehandlungsfunktionen hilft. Der Funktionsprototyp lautet wie folgt:

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

Es ist erwähnenswert, dass selbst wenn die Fehlerbehandlungsfunktion registriert ist, Das Standardverhalten ist weiterhin: Bei der Ausführung wird die Fehlermeldung weiterhin ausgegeben, wenn ein Fehler auftritt. Sie müssen daher die Fehlerstufe im Programm explizit auf 0 setzen und dann Ihre eigene Fehlerbehandlungsfunktion registrieren. Dieser Ansatz ist besonders in einer Produktionsumgebung wichtig, denn selbst wenn etwas schief geht, werden sensible interne Fehlerinformationen nicht potenziell böswilligen Benutzern zugänglich gemacht. Es ist auch wichtig darauf hinzuweisen, dass benutzerdefinierte Fehlerbehandlungsfunktionen keine schwerwiegenden Fehler (z. B. Kompilierungsfehler) behandeln können. Das Folgende ist ein Beispiel für die Verwendung einer benutzerdefinierten Fehlerbehandlungsfunktion:

<?php
error_reporting (0);
function error_handler ($error_level, $error_message, $file, $line) {
  $EXIT = FALSE;
  switch ($error_level) {
    case E_NOTICE:
    case E_USER_NOTICE:
      $error_type = &#39;Notice&#39;;
      break;
    case E_WARNING:
    case E_USER_WARNING:
      $error_type = &#39;Warning&#39;;
      break;
    case E_ERROR:
    case E_USER_ERROR:
      $error_type = &#39;Fatal Error&#39;;
      $EXIT = TRUE;
      break;
    default:
      $error_type = &#39;Unknown&#39;;
      $EXIT = TRUE;
      break;
  }
  printf ("%s: %s in %s on line %d\n", $error_type, $error_message, $file, $line);
 
  if ($EXIT) {
    die();
  }
}
set_error_handler (&#39;error_handler&#39;);
 
//new NonExist();
echo $novar;
echo 3/0;
trigger_error (&#39;Trigger a fatal error&#39;, E_USER_ERROR);
new NonExist();
?>

Das Ausführen dieses Skripts kann die folgende Ausgabe erhalten:

Notice: Undefined variable: novar in /your/php_demo_file.php on line 40

Warning: pision by zero in /your/php_demo_file.php on line 41

Fatal Error: Trigger a fatal error in /your/php_demo_file.php on line 42

Wie Sie sehen können, ist die letzte „neue NoExistClass ()“-Ausnahme wurde von der benutzerdefinierten Fehlerbehandlungsfunktion nicht abgefangen.

Abschließend registriert set_Exception_handler die Ausnahmebehandlung der obersten Ebene. In Webanwendungen können Sie diese festlegen und dann einheitlich zur Fehlerbehandlungsseite springen.

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der globalen Fehlerbehandlung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn