In diesem Artikel erfahren Sie, wie PHP7 set_error_handler und set_Exception_handler verwendet, um Ausnahmemechanismen zu behandeln. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Aus historischen Gründen wurde PHP ursprünglich als prozessorientierte Sprache entwickelt, daher verwendet die Ausnahmebehandlung nicht den Try/Catch-Mechanismus wie Java. Wenn ein Fehler auftritt, wird er direkt auf der Seite angezeigt oder protokolliert Im Fehlerprotokoll werden PHP-Fehler in viele Ebenen unterteilt, z. B. E_ERROR, E_WARNING, E_PARSE, E_NOTICE usw. Bei schwerwiegenden Fehlern wie E_ERROR und E_PARSE bricht PHP die Ausführung des Skripts direkt ab.
Obwohl wir für die PHP5-Version set_error_handler verwenden können, um unsere eigene Fehlerbehandlungsmethode anstelle der Standard-Fehlerbehandlungsmethode von PHP zu registrieren (Ausgabe auf der Seite oder Aufzeichnung im Protokoll), können einige schwerwiegende Fehler jedoch nicht speziell behandelt werden Schauen wir uns die Einführung des Handbuchs zu dieser Methode an:
mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) 设置一个用户的函数(error_handler)来处理脚本中出现的错误。 本函数可以用你自己定义的方式来处理运行中的错误, 例如,在应用程序中严重错误发生时,或者在特定条件下触发了一个错误(使用 trigger_error()),你需要对数据/文件做清理回收。 重要的是要记住 error_types 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 FALSE。 error_reporting() 设置将不会起到作用而你的错误处理函数继续会被调用 —— 不过你仍然可以获取 error_reporting 的当前值,并做适当处理。 需要特别注意的是带 @ error-control operator 前缀的语句发生错误时,这个值会是 0。 同时注意,在需要时你有责任使用 die()。 如果错误处理程序返回了,脚本将会继续执行发生错误的后一行。 以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
Das Handbuch sagt sehr deutlich, dass Fehler wie E_ERROR und E_PARSE von Benutzern nicht behandelt werden können (das folgende Beispiel wird mit PHP5.6 ausgeführt)
<?php //自定义的错误处理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "错误编号errno: $errno<br>"; echo "错误信息errstr: $errstr<br>"; echo "出错文件errfile: $errfile<br>"; echo "出错行号errline: $errline<br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误 echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误
Run result:
错误编号errno: 8 错误信息errstr: Undefined variable: foo 出错文件errfile: D:\project\demo\demo.php 出错行号errline: 16
Zu diesem Zeitpunkt wird die Fehlermeldung nicht wie üblich direkt auf der Seite ausgegeben, sondern auf unsere eigene Weise verarbeitet. Wenn die Funktion set_error_handler nicht verwendet wird, wird die Fehlermeldung wie folgt angezeigt. Natürlich können wir die Fehleranzeige von PHP ausschalten, sodass Fehler nicht direkt auf der Seite angezeigt werden.
Notice: Undefined variable: foo in D:\project\demo\demo.php on line 15
Dieser Verarbeitungsmechanismus scheint ziemlich gut zu sein, aber wie oben erwähnt, können nicht alle Fehler auf diese Weise behandelt werden. Ändern Sie den obigen Code wie folgt:
<?php //自定义的错误处理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "错误编号errno: $errno<br>"; echo "错误信息errstr: $errstr<br>"; echo "出错文件errfile: $errfile<br>"; echo "出错行号errline: $errline<br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误 echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误 trigger_error('人为触发一个错误', E_USER_ERROR); //人为触发错误 foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误
Erneut ausführen:
错误编号errno: 8 错误信息errstr: Undefined variable: foo 出错文件errfile: D:\project\demo\demo.php 出错行号errline: 15 错误编号errno: 256 错误信息errstr: 人为产生触发一个错误 出错文件errfile: D:\project\demo\demo.php 出错行号errline: 17 Fatal error: Call to undefined function foobar() in D:\project\demo\demo.php on line 19
Wie wir erwartet hatten, waren die ersten beiden Fehler „. „abgefangen“ und von uns verarbeitet, aber der endgültige schwerwiegende Fehler wurde nicht gemäß der von uns registrierten Fehlerfunktion behandelt, sondern es wurde die Standardverarbeitungsmethode verwendet. Dies ist auch ein schwerwiegender Fehler in der Fehlerbehandlung der PHP5-Version. Nach PHP7 gibt es einige neue Änderungen in der Ausnahmebehandlungsmethode. Schauen wir uns die Einführung im Handbuch an:
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。
Dieser Fehlerbehandlungsmechanismus von PHP7 ist wie das Erlernen von Java, wodurch wir die meisten Ausnahmen selbst behandeln können Das folgende Codebeispiel (der folgende Code wird mit PHP7 ausgeführt)
<?php //自定义的错误处理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "错误编号errno: $errno<br>"; echo "错误信息errstr: $errstr<br>"; echo "出错文件errfile: $errfile<br>"; echo "出错行号errline: $errline<br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误 try { echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误 trigger_error('人为产生触发一个错误', E_USER_ERROR); //人为触发错误 foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误 } catch (Error $e) { echo "Error code: " . $e->getCode() . '<br>'; echo "Error message: " . $e->getMessage() . '<br>'; echo "Error file: " . $e->getFile() . '<br>'; echo "Error fileline: " . $e->getLine() . '<br>'; }
Das laufende Ergebnis:
错误编号errno: 8 错误信息errstr: Undefined variable: foo 出错文件errfile: E:\project\demo\demo.php 出错行号errline: 17 错误编号errno: 256 错误信息errstr: 人为产生触发一个错误 出错文件errfile: E:\project\demo\demo.php 出错行号errline: 19 Error code: 0 Error message: Call to undefined function foobar() Error file: E:\project\demo\demo.php Error fileline: 21
Auf diese Weise können wir verschiedene Arten von Fehlern selbst behandeln, einschließlich schwerwiegender Fehler. Wenn try/catch nicht verwendet wird, unterscheidet sich die Fehlermeldung von PHP7 immer noch etwas von der von PHP5:
错误编号errno: 8 错误信息errstr: Undefined variable: foo 出错文件errfile: E:\project\demo\demo.php 出错行号errline: 17 错误编号errno: 256 错误信息errstr: 人为触发一个错误 出错文件errfile: E:\project\demo\demo.php 出错行号errline: 19 Fatal error: Uncaught Error: Call to undefined function foobar() in E:\project\demo\demo.php:21 Stack trace: #0 {main} thrown in E:\project\demo\demo.php on line 21
Die Beschreibung des schwerwiegenden Fehlers lautet: Ein Fehler wurde nicht abgefangen.
Beachten Sie, dass der Fang hier auf das Abfangen von Fehlern der Error-Klasse beschränkt ist und im Handbuch eindeutig angegeben ist, dass die Error-Klasse keine Unterklasse der Exception-Klasse ist, wenn ich also gleichzeitig den Exception-Fehler im Code abfangen möchte Zeit, ist das nicht unmöglich? Bitte sehen Sie sich den Code an:
<?php //自定义的错误处理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "错误编号errno: $errno<br>"; echo "错误信息errstr: $errstr<br>"; echo "出错文件errfile: $errfile<br>"; echo "出错行号errline: $errline<br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误 try { echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误 trigger_error('人为触发一个错误', E_USER_ERROR); //人为触发错误 throw new Exception('This is a exception', 400); //抛出一个Exception,看是否可以被catch foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误 } catch (Error $e) { echo "Error code: " . $e->getCode() . '<br>'; echo "Error message: " . $e->getMessage() . '<br>'; echo "Error file: " . $e->getFile() . '<br>'; echo "Error fileline: " . $e->getLine() . '<br>'; }
Laufergebnis:
错误编号errno: 8 错误信息errstr: Undefined variable: foo 出错文件errfile: E:\project\demo\demo.php 出错行号errline: 17 错误编号errno: 256 错误信息errstr: 人为触发一个错误 出错文件errfile: E:\project\demo\demo.php 出错行号errline: 19 Fatal error: Uncaught Exception: This is a exception in E:\project\demo\demo.php:21 Stack trace: #0 {main} thrown in E:\project\demo\demo.php on line 21
Gibt es tatsächlich eine Möglichkeit, wenn wir uns das Vererbungsdiagramm im Handbuch ansehen? und die Exception-Klasse sind beide Unterklassen von Throwable (eigentlich implementieren sowohl die Error-Klasse als auch die Exception-Klasse die Throwable-Schnittstelle), sodass der obige Code wie folgt optimiert werden kann:
<?php //自定义的错误处理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "错误编号errno: $errno<br>"; echo "错误信息errstr: $errstr<br>"; echo "出错文件errfile: $errfile<br>"; echo "出错行号errline: $errline<br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误 try { echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误 trigger_error('人为触发一个错误', E_USER_ERROR); //人为触发错误 if (mt_rand(1, 10) > 5) { throw new Exception('This is a exception', 400); //抛出一个Exception,看是否可以被catch } else { foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误 } } catch (Throwable $e) { echo "Error code: " . $e->getCode() . '<br>'; echo "Error message: " . $e->getMessage() . '<br>'; echo "Error file: " . $e->getFile() . '<br>'; echo "Error fileline: " . $e->getLine() . '<br>'; }
Sie können sehen, ob dies der Fall ist, indem Sie ihn mehrmals ausführen Wenn es sich um eine Ausnahmeausnahme oder eine Fehlerausnahme handelt, kann sie abgefangen und verarbeitet werden.
Wenn Sie nicht möchten, dass alle Fehler mit try/catch behandelt werden, können Sie auch set_Exception_handler verwenden, um eine Ausnahmebehandlungsfunktion zu registrieren, sodass das System beim Auftreten einer nicht abgefangenen Ausnahme automatisch die registrierte Handlerfunktion für uns aufruft handhaben.
<?php //自定义的错误处理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "错误编号errno: $errno<br>"; echo "错误信息errstr: $errstr<br>"; echo "出错文件errfile: $errfile<br>"; echo "出错行号errline: $errline<br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误 function _exception_handler(Throwable $e) { if ($e instanceof Error) { echo "catch Error: " . $e->getCode() . ' ' . $e->getMessage() . '<br>'; } else { echo "catch Exception: " . $e->getCode() . ' ' . $e->getMessage() . '<br>'; } } set_exception_handler('_exception_handler'); // 注册异常处理方法来捕获异常 echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误 trigger_error('人为触发一个错误', E_USER_ERROR); //人为触发错误 if (mt_rand(1, 10) > 5) { throw new Exception('This is a exception', 400); //抛出一个Exception,看是否可以被catch } else { foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误 }
Zu diesem Zeitpunkt sind wir möglicherweise wieder verwirrt darüber, welche von set_error_handler und welche von set_Exception_handler behandelt werden. Meiner Zusammenfassung zufolge führt das im Allgemeinen nicht zu Fehlern Bei der Beendigung handelt es sich um eine set_error_handler-Verarbeitung, und schwerwiegende Fehler, die die Ausführung des Skripts beenden, werden als Fehler ausgegeben, jedoch nicht unbedingt. Der oben künstlich ausgelöste
E_USER_ERROR ist ein Fehler, der die Ausführung des Skripts unterbricht, dies ist jedoch nicht der Fall Es wird als Fehlerausnahme ausgelöst und von der von set_error_handler registrierten Methode behandelt. Dies liegt möglicherweise daran, dass diese Art von Fehler von uns selbst generiert wird. Daher ist die Fehlerbehandlung von PHP7 immer noch etwas unklar und wir müssen vorsichtiger sein wir kümmern uns selbst darum.
Empfohlenes Lernen:
php-Video-TutorialDas obige ist der detaillierte Inhalt vonWie PHP7 set_error_handler und set_Exception_handler verwendet, um Ausnahmemechanismen zu behandeln. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!