Yii hat standardmäßig die Ausnahme- und Fehlerübernahme für CApplication implementiert, die über set_Exception_handler und set_error_handler von PHP implementiert wird. Durch diese beiden in PHP integrierten Funktionen können nicht abgefangene Ausnahmen und Fehler im Programm übernommen werden, wodurch die Wartbarkeit des Programms verbessert wird.
Standardmäßig weist Yii die Ausnahmebehandlung CApplication::handleException und die Fehlerbehandlung CApplication::handleError zu. Sie können die Verwendung von Yii jedoch deaktivieren, indem Sie die beiden Konstanten YII_ENABLE_EXCEPTION_HANDLER und YII_ENABLE_ERROR_HANDLER in der Eintragsdatei als falsch definieren. Ausnahme- und Fehlerbehandlungsmechanismus.
Im Folgenden werden Ausnahmen und Fehler zusammenfassend als Fehler bezeichnet und bei Bedarf detailliert unterschieden. Die YII_DEBUG-Konstante (Standard ist false, kann in der Eintragsdatei festgelegt werden) hat einen sehr wichtigen Einfluss auf die Anzeige von Fehlerinformationen. Im Debug-Modus ist die Fehlerausgabe am detailliertesten. Sobald das Programm in Betrieb genommen wird, sollte YII_DEBUG auf false geändert werden.
Unabhängig davon, ob es sich im Debug-Modus befindet oder nicht, werden die relevanten Fehlerinformationen aufgezeichnet, wenn das Yii-Programm einen Fehler generiert (die Fehlerebene ist Fehler und die Standardkategorie ist Anwendung). Der Unterschied besteht darin, dass im Debug-Modus detaillierte Informationen direkt auf der Webseite angezeigt werden.
CApplication:: handleError($code,$message,$file,$line)
Die obige Methode implementiert die relevante Logik. Achten Sie besonders auf die Funktionen „restore_error_handler“ und „restore_Exception_handler“. Wenn diese beiden Funktionen nicht aufgerufen werden, wird CApplication:: handleError während des nachfolgenden Fehlerbehandlungsprozesses erneut aufgerufen, was zu einer Endlosschleife führen kann. Daher verbietet Yii vorübergehend die Verwendung von CApplication::handleError zur Übernahme nachfolgender Fehler und Ausnahmen (unter Verwendung des standardmäßigen Fehlerbehandlungsmechanismus von PHP), wodurch sichergestellt wird, dass keine Schleifenaufrufe auftreten.
PHP-Fehlerbehandlung Welche Informationen zeichnet PHP im Protokoll auf, wenn ein Fehler auftritt? Fehlercode (d. h. PHPs E_ERROR E_WARNING E_STRICT E_DEPRECATED) Nachrichteninhalt (z. B. Undefinierte Variable $input) Der Dateipfad, der den Fehler generiert hat. Die Zeilennummer, die den Fehler generiert hat. Zusätzliche Tracking-Backtrace-Informationen (dies wird durch debug_backtrace erreicht). Die aktuelle URL
Zusätzlich zur Protokollierung der entsprechenden Protokollierung führt Yii auch eine nachfolgende Verarbeitung von Fehlern durch (z. B. Unterbrechung der Ausführung, Anzeige von Fehlerseiten usw.). Standardmäßig wird die Fehlerbehandlung an die Komponente CErrorHandler übergeben (Fehler können jedoch auftreten). Dies kann durch die Bindung des onError-Ereignishandlers an CApplicaton realisiert werden. Sekundäre Übernahme der Verarbeitung, hier ist das Design flexibel.
Zu diesem Zeitpunkt wird ein CErrorEvent generiert (und enthält mehrere Schlüsselparameter wie $code, $message, $file und $line) und zur Verarbeitung an die CErrorHandler-Komponente übergeben. Insbesondere wird es von CErrorHandler::handleError behandelt. Dieser Prozess dient hauptsächlich dazu, fehlerbezogene Informationen zu organisieren und auf geeignete Weise anzuzeigen.
Ob es sich im Debug-Modus befindet (YII_DEBUG==true), hat einen großen Einfluss auf die Anzeige von Fehlermeldungen. Im Debug-Modus möchten wir detaillierte Fehlerverfolgungsinformationen anzeigen, während wir im Produktionsmodus eine benutzerfreundliche Seite anzeigen möchten. Daher ist die Fehleranzeige hier unterschiedlich und die Unterschiede werden im Folgenden erläutert.
Im Debug-Modus wird die Ausnahmeansicht direkt gerendert, um Fehler anzuzeigen. Es wird nach dem folgenden Pfad gesucht:
protected/views/system/Exception.php
YII_PATH/views/Exception.php
Offensichtlich ist das Verzeichnis „views/system“ in der Anwendung nicht standardmäßig definiert, daher ist das Verzeichnis „views/system“ nicht standardmäßig in der Anwendung definiert Es wird das System-Framework verwendet. Wird mit Ansichtsdateien geliefert. Die endgültige eingebundene Datei ist „views/Exception.php“ aus dem Yii-Framework.
Aus der obigen Analyse können wir erkennen, dass wir die Datei protected/views/system/Exception.php konfigurieren müssen, wenn wir eine benutzerdefinierte Ausnahmeseite im Debugging-Modus verwenden möchten (im Allgemeinen macht dies möglicherweise nicht viel Sinn). welche verwendet werden können Die Variable ist $data.
Im Nicht-Debugging-Modus wird die folgende Verarbeitung durchgeführt:
Wenn die errorAction-Routing-Informationen für die errorHandler-Komponente in der Konfigurationsdatei definiert sind, führen Sie sie direkt aus, andernfalls führen Sie den Schritt 2-Prozess aus.
Versuchen Sie, die Fehleransicht zu laden, suchen Sie nach dem folgenden Pfad (die erste durchsuchte Datei wird verwendet)
protected/views/system/zh_cn/error500.php
protected/views/system/error500.php
protected /views/system/zh_cn/error.php
protected/views/system/error.php
YII_PATH/views/zh_cn/error500.php
YII_PATH/views/error500.php
YII_PATH/views/zh_cn/ error .php
Y II_PATH/views/error.php
Ausnahmebehandlung Der Ausnahmebehandlungsmechanismus ähnelt dem Fehlerbehandlungsmechanismus. Die Protokolle werden ebenfalls aufgezeichnet. „Exception.$EXCEPTIONCLASS“. Wenn es sich um eine CHttpException-Klassenausnahme handelt, lautet der Kategoriename „Exception.CHttpException.$STATUS_CODE“. Die Ausnahmeklassifizierung von Daten heißt beispielsweise „Exception.CDbException“.
Als nächstes wird das Fehlerereignis CExceptionEvent zur Verarbeitung an den errorHandler übergeben. Alle Fehlerinformationen werden vom CExceptionEvent-Objekt übergeben. Die Verarbeitungsmethode ist wie folgt:
Im Debug-Modus werden die Ansichtsdateien in der folgenden Reihenfolge durchsucht und die erste durchsuchte Datei wird verwendet
protected/views/system/Exception.php
YII_PATH/views/ Ausnahme.php
Wenn es sich im Nicht-Debugging-Modus befindet und die Attributroute „errorAction“ für die Komponente „errorHandler“ in der Konfigurationsdatei definiert ist, führen Sie es aus, andernfalls fahren Sie mit Schritt 3 fort.
Versuchen Sie, Ansichtsdateien in der folgenden Reihenfolge zu laden. Die zuerst gesuchte Datei wird verwendet Passen Sie die Details der Fehlerseite an. Das anschließende Flussdiagramm beschreibt den Prozess im Detail.
Wie Sie auf dem Bild sehen können, besteht der einfachste Weg darin, das Attribut „errorAction“ für die Komponente „errorHandler“ festzulegen, um die Route anzugeben, auf der der Fehler auftritt.
Im Allgemeinen sind wir am meisten besorgt über die Anzeige der Fehlerseite im Produktionsmodus. Nach der obigen Analyse stehen zwei Methoden zur Verfügung:
Definieren Sie das Routing-Attribut „errorAction“ für die Komponente „errorHandler“ in der Konfigurationsdatei (diese Methode sollte zuerst verwendet werden, um eine flexible Konfiguration zu erreichen).
Definieren eine der folgenden Dateien zum Implementieren benutzerdefinierter Fehlerseite (nicht empfohlen)
Protected/views/system/zh_cn/error500.php
protected/views/system/error500.php
protected/views/system/zh_cn/error. php
protected/views/system/ error.php
Die erste Methode ist flexibel und kontrollierbar. Sie können die Ansichtsdatei im Controller angeben, die flexibel und kontrollierbar ist.
Beispiel für die Verwendung eines Fehlerhandlers
yiiwebErrorHandler ist als Anwendungskomponente mit dem Namen errorHandler registriert, die in der Anwendungskonfiguration wie folgt konfiguriert werden kann:
protected/views/system/zh_cn/error500.phpprotected/views/system/error500.phpprotected/views/system/zh_cn/error.phpprotected/views/system/error.phpYII_PATH/views/zh_cn/error500.phpYII_PATH/views/error500.phpYII_PATH/views/zh_cn/error.phpY II_PATH/views/error.php
Mit dem obigen Code zeigt die Ausnahmeseite bis zu 20 Quellcodes an.
Wie bereits erwähnt, wandelt der Fehlerhandler alle nicht schwerwiegenden PHP-Fehler in abfangbare Ausnahmen um, was bedeutet, dass Sie den folgenden Code zur Behandlung von PHP-Fehlern verwenden können:
return [ 'components' => [ 'errorHandler' => [ 'maxSourceLines' => 20, ], ], ];
Wenn Sie eine Fehlerseite anzeigen möchten, die den Benutzer über die Anforderung informiert ist ungültig oder Wenn es nicht behandelt werden kann, können Sie einfach eine yiiwebHttpException auslösen, z. B. yiiwebNotFoundHttpException. Der Fehlerhandler legt den Antwort-HTTP-Statuscode korrekt fest und verwendet die entsprechende Fehleransichtsseite, um die Fehlermeldung anzuzeigen.
use Yii; use yii\base\ErrorException; try { 10/0; } catch (ErrorException $e) { Yii::warning("pision by zero."); } // execution continues...
Benutzerdefinierte Fehleranzeige
yiiwebErrorHandler-Fehlerhandler passt die Fehleranzeige entsprechend dem Wert der Konstante YII_DEBUG an (was den Debug-Modus anzeigt), zeigt der Fehlerhandler Ausnahmen und detaillierte Funktionsaufrufstapel und Quellcodezeilen an, um zu helfen Beim Debuggen werden nur Fehlermeldungen angezeigt, wenn YII_DEBUG falsch ist, um den Verlust vertraulicher Informationen der Anwendung zu verhindern.
Hinzugefügt: Wenn die Ausnahme yiibaseUserException erbt, werden die Informationen zum Funktionsaufrufstapel unabhängig vom Wert von YII_DEBUG nicht angezeigt. Dies liegt daran, dass dieser Fehler als vom Benutzer generierter Fehler betrachtet wird und Entwickler ihn nicht korrigieren müssen .
yiiwebErrorHandler-Fehlerhandler verwendet standardmäßig zwei Ansichten zur Anzeige von Fehlern:
@yii/views/errorHandler/error.php: wird zur Anzeige von Fehlermeldungen verwendet, die keine Informationen zum Funktionsaufrufstapel enthalten. Wenn YII_DEBUG falsch ist, sind es alle Fehler die Aussicht genutzt.
@yii/views/errorHandler/Exception.php: Wird beim Anzeigen von Fehlermeldungen verwendet, die Informationen zum Funktionsaufrufstapel enthalten.
Sie können die Eigenschaften yiiwebErrorHandler::errorView und yiiwebErrorHandler::ExceptionView des Fehlerhandlers konfigurieren, um eine benutzerdefinierte Fehleranzeigeansicht zu verwenden.
Fehleraktion verwenden
Es ist bequemer, die angegebene Fehleraktion zum Anpassen der Fehleranzeige zu verwenden. Konfigurieren Sie dazu zunächst das Attribut yiiwebErrorHandler::errorAction der Komponente errorHandler, ähnlich wie folgt:
use yii\web\NotFoundHttpException; throw new NotFoundHttpException();
yiiwebErrorHandler:: Das Attribut „errorAction“ verwendet das Routing zu einer Aktion. Die obige Konfiguration bedeutet, dass Fehler, die keine Informationen zum Funktionsaufrufstapel anzeigen müssen, durch Ausführen der Site-/Fehleroperation angezeigt werden.
Sie können eine Site-/Fehleraktion wie folgt erstellen:
return [ 'components' => [ 'errorHandler' => [ 'errorAction' => 'site/error', ], ] ];
Der obige Code definiert die Fehleraktion mithilfe der yiiwebErrorAction-Klasse, die eine Ansicht mit dem Namen „error“ rendert, um Fehler anzuzeigen.
Zusätzlich zur Verwendung von yiiwebErrorAction können Sie die Fehleroperation mit einer Operationsmethode ähnlich der folgenden definieren:
namespace app\controllers; use Yii; use yii\web\Controller; class SiteController extends Controller { public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], ]; } }
Jetzt sollten Sie eine Ansichtsdatei als „views/site/error.php“ erstellen. Wenn der Fehler auftritt Aktion ist als yiiwebErrorAction definiert, auf die Sie zugreifen können. Die folgenden Variablen sind in dieser Operation definiert:
Name: Fehlername
Nachricht: Fehlermeldung
Ausnahme: Ausnahmeobjekt mit detaillierteren Informationen wie HTTP-Statuscode, Fehlercode, Fehleraufrufstapel usw.
Ergänzung: Wenn Sie die Basic Application Template oder die Advanced Application Template verwenden, sind die Fehleroperationen und Fehleransichten bereits definiert.
Benutzerdefiniertes Fehlerformat
Der Fehlerhandler zeigt Fehler entsprechend dem durch die Antwort festgelegten Format an. Wenn das Antwortformat yiiwebResponse::format HTML ist, wird die Fehler- oder Ausnahmeansicht verwendet, um die Fehlerinformationen anzuzeigen, wie im beschrieben vorherigen Abschnitt. Bei anderen Antwortformaten weist der Fehlerhandler die Fehlerinformationen als Array dem Attribut yiiwebResponse::data zu und konvertiert sie dann in das entsprechende Format. Wenn das Antwortformat beispielsweise json ist, können Sie die folgenden Antwortinformationen sehen:
public function actionError() { $exception = Yii::$app->errorHandler->exception; if ($exception !== null) { return $this->render('error', ['exception' => $exception]); } }
Kann in der Anwendung verwendet werden. Reagieren Sie auf das beforeSend-Ereignis der Antwortkomponente in der Konfiguration, um das Fehlerantwortformat anzupassen.
return [ // ... 'components' => [ 'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) { $response = $event->sender; if ($response->data !== null) { $response->data = [ 'success' => $response->isSuccessful, 'data' => $response->data, ]; $response->statusCode = 200; } }, ], ], ];
上述代码会重新格式化错误响应,类似如下:
HTTP/1.1 200 OK Date: Sun, 02 Mar 2014 05:31:43 GMT Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y Transfer-Encoding: chunked Content-Type: application/json; charset=UTF-8 { "success": false, "data": { "name": "Not Found Exception", "message": "The requested resource was not found.", "code": 0, "status": 404 } }
推荐学习:php视频教程
Das obige ist der detaillierte Inhalt vonBeispiele zur Erläuterung, wie PHP Fehler und Ausnahmen im Yii-Framework behandelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!