Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielfreigabe für PHP7-Fehler- und Ausnahmebehandlung

Beispielfreigabe für PHP7-Fehler- und Ausnahmebehandlung

小云云
小云云Original
2018-03-13 09:52:302429Durchsuche

Ähnlichkeiten und Unterschiede zwischen Fehlern und Ausnahmen

Die Konzepte „Fehler“ und „Ausnahme“ sind sehr ähnlich und können leicht verwechselt werden. Sowohl „Fehler“ als auch „Ausnahme“ weisen darauf hin, dass ein Problem vorliegt das Projekt und liefert relevante Informationen, und beide haben Fehlertypen. Der „Ausnahmemechanismus“ erschien jedoch nach dem „Fehlermechanismus“, und „Ausnahme“ ist der Mangel bei der Vermeidung von „Fehlern“. Der wichtigere Punkt ist, dass die „Fehler“-Informationen nicht umfangreich sind. Die häufigste Funktionsbeschreibung, die wir gesehen haben, ist: „Gib *** zurück, wenn ein Fehler auftritt.“ Es kann jedoch viele Gründe für einen Funktionsfehler geben , und die Arten von Fehlern Es gibt noch viele weitere. Ein einfaches FALSE kann dem Aufrufer nicht die spezifische Fehlermeldung mitteilen.

In PHP wird die eigene Ausnahme des Codes (normalerweise verursacht durch die Umgebung oder illegale Syntax) zu einem Fehler werden während des Betriebs angezeigt. Fehler können nicht durch Code behandelt werden, aber Ausnahmen können durch try/catch behandelt werden. Wenn ein Problem auftritt, wird es ausgelöst, um die Initiative zu ergreifen und Verantwortlichkeiten zu delegieren. Ausnahmen können auch zur Abwehr, zur Vorhersage potenzieller Probleme und zur Abschwächung ihrer Auswirkungen verwendet werden.

Ausnahmeobjekt hat zwei Haupteigenschaften: eine ist die Nachricht und die andere ist der numerische Code. Wir können diese beiden Eigenschaften mit getCode() bzw. getMessage() erhalten. Wie folgt:

Wirft eine Ausnahme aus

Wenn eine Ausnahme ausgelöst wird, wird die Ausführung des Codes sofort gestoppt und nachfolgender Code wird nicht weiter ausgeführt, um eine Übereinstimmung zu finden „catch“-Codeblock. Wenn eine Ausnahme nicht abgefangen wird und nicht entsprechend mit set_Exception_handler() behandelt wird, generiert PHP einen schwerwiegenden Fehler und gibt die Meldung „Uncaught Exception...“ aus.
<?php 
$exception = new Exception("figthing!!!",100);
$code = $exception->getCode();//100
$message = $exception->getMessage();//fight.....

Ausnahmen abfangen

Wir sollten die ausgelösten Ausnahmen abfangen und sie auf elegante Weise behandeln. Die Möglichkeit, Ausnahmen abzufangen und zu behandeln, besteht darin, den Code, der Ausnahmen auslösen kann, in Try/Catch-Blöcken unterzubringen. Und wenn mehrere Catches zum Abfangen mehrerer Ausnahmen verwendet werden, wird nur eine davon ausgeführt. Wenn PHP keinen geeigneten Catch-Block findet, wird die Ausnahme so lange in die Höhe schnellen, bis das PHP-Skript aufgrund eines schwerwiegenden Fehlers beendet wird. Wie folgt:
throw new Exception("this is a exception");//使用throw抛出异常

Ausnahmebehandler

try {
	throw new Exception("Error Processing Request");
	$pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name");
} catch (PDOException $e) {
	echo "pdo error!";
} catch(Exception $e){
	echo "exception!";
}finally{
    echo "end!";//finally是在捕获到任何类型的异常后都会运行的一段代码
}
Wie sollen wir also jede Ausnahme abfangen, die möglicherweise ausgelöst wird? Mit PHP können wir einen globalen Ausnahmehandler registrieren, der alle nicht erfassten Ausnahmen abfängt. Ausnahmehandler werden mit der Funktion set_Exception_handler() registriert (hier wird eine anonyme Funktion verwendet).
运行结果:exception!end!

Fehler

Neben Ausnahmen stellt PHP auch Funktionen zur Fehlermeldung zur Verfügung. PHP kann verschiedene Arten von Fehlern auslösen, z. B. schwerwiegende Fehler, Laufzeitfehler, Fehler bei der Kompilierung, Startfehler und vom Benutzer ausgelöste Fehler. Die Fehlerberichterstattungsmethode kann in php.ini eingestellt werden (hier keine weitere Erklärung)
set_exception_handler(function (Exception $e)
{
	echo "我自己定义的异常处理".$e->getMessage();
});
throw new Exception("this is a exception");
//运行结果:我自己定义的异常处理this is a exception

Im Folgenden sind einige Fehlerberichterstattungsstufen aufgeführt:

In jedem Fall müssen die folgenden Regeln befolgt werden :

值          常量                     说明1           E_ERROR             报告导致脚本终止运行的致命错误2   
        E_WARNING           报告运行时的警告类错误(脚本不会终止运行)4           E_PARSE        
             报告编译时的语法解析错误8           E_NOTICE            报告通知类错误,脚本可能会产生错误32767 
                  E_ALL               报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)

Stellen Sie sicher, dass PHP Fehler meldet

  • Fehler in der Entwicklungsumgebung anzeigen

  • in Fehler können in der Produktionsumgebung nicht angezeigt werden

  • Fehler sowohl in der Entwicklungs- als auch in der Produktionsumgebung protokollieren

  • Fehlerbehandler

  • Gefällt mir Neben Ausnahmehandlern können wir auch set_error_handler() verwenden, um einen globalen Fehlerhandler zu registrieren und unsere eigene Logik zum Abfangen und Behandeln von PHP-Fehlern zu verwenden. Wir müssen die Funktion die() oder exit() im Fehlerhandler aufrufen. Wenn es nicht aufgerufen wird, setzt das PHP-Skript die Ausführung an der Stelle fort, an der der Fehler aufgetreten ist. Wie folgt:

Ausführungsergebnis:

Fehlerstufe: 1024

Fehlermeldung: Dies ist ein Fehler
set_error_handler(function ($errno,$errstr,$errfile,$errline)//常用的四个参数
{
	echo "错误等级:".$errno."<br>错误信息:".$errstr."<br>错误的文件名:".$errfile."<br>错误的行号:".$errline;
	exit();
});
trigger_error("this is a error");//自行触发的错误
echo &#39;正常&#39;;
Falscher Dateiname: /Users/toby/Desktop/www/Exception. php

Fehlerzeilennummer: 33

Es gibt auch eine verwandte Funktion register_shutdown_function() – eine Funktion, die ausgeführt wird, wenn PHP angehalten wird. (Wenn Sie interessiert sind, können Sie es selbst überprüfen)

Fehler in Ausnahmen umwandeln

Wir können PHP-Fehler in Ausnahmen umwandeln (nicht alle Fehler können konvertiert werden, sondern nur die Datei php.ini werden konvertiert Fehler, die durch die Direktive „error_reporting“ festgelegt werden), behandeln Fehler mithilfe des vorhandenen Prozesses zur Behandlung von Ausnahmen. Hier verwenden wir die Funktion set_error_handler(), um die Fehlerinformationen in ErrorException (einer Unterklasse von Exception) zu hosten und sie dann zur Verarbeitung an das vorhandene Ausnahmebehandlungssystem zu übergeben. Wie folgt:

Ausführungsergebnis: Meine eigene definierte Ausnahmebehandlung. Dies ist ein Fehler.

PHP7-Fehlerausnahmebehandlung
set_exception_handler(function (Exception $e)
{
	echo "我自己定义的异常处理".$e->getMessage();
});
set_error_handler(function ($errno, $errstr, $errfile, $errline )
{
	throw new ErrorException($errstr, 0, $errno, $errfile, $errline);//转换为异常
});
trigger_error("this is a error");//自行触发错误

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。

$a=1;
try {
$a->abc();//未定义此对象
} catch (Exception $e) {
	echo "error";
} catch (Error $e) {
	echo $e->getCode();
}

运行结果:0

PHP7 中出现了 Throwable 接口,该接口由 Error 和 Exception 实现,用户不能直接实现 Throwable 接口,而只能通过继承 Exception 来实现接口

try {
// Code that may throw an Exception or Error.
} catch (Throwable $t) {
// Executed only in PHP 7, will not match in PHP 5.x
} catch (Exception $e) {
// Executed only in PHP 5.x, will not be reached in PHP 7
}

注意实际项目中,在开发环境中我们可以使用Whoops组件,在生产环境中我们可以使用Monolog组件。

相关推荐:

PHP错误处理方法实例

php错误处理和日志记录

PHP异常处理和错误处理方法分享

Das obige ist der detaillierte Inhalt vonBeispielfreigabe für PHP7-Fehler- und Ausnahmebehandlung. 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