Fehler
Fehlerstufe
Schwerwiegender Fehler: Schwerwiegender Fehler (Skript beendet Ausführung)
E_ERROR Schwerwiegender Laufzeitfehler, bricht Programmausführung ab
E_CORE_ERROR Schwerwiegender Fehler, wenn PHP wird gestartet
E_COMPILE_ERROR Schwerwiegender Fehler beim Kompilieren von PHP
E_USER_ERROR Schwerwiegender Fehler, der von Benutzern generiert wurde
Analysefehler: Analysefehler während der Kompilierung (Skript wird ausgeführt)
Analysefehlersyntax Analysefehler während der Kompilierung
Warnungsfehler: Warnfehler (es werden nur Eingabeaufforderungsinformationen bereitgestellt, aber das Skript beendet den Vorgang nicht.)
E_WARNING Laufzeitwarnung (nicht schwerwiegender Fehler) .
E_CORE_WARNING Warnung (nicht schwerwiegender Fehler), die während des PHP-Initialisierungsstarts auftritt.
E_COMPILE_WARNING Kompilierungswarnung
E_USER_WARNING Vom Benutzer generierte Warnmeldung
Hinweisfehler: Benachrichtigungsfehler (es werden nur Benachrichtigungsinformationen angegeben, aber das Skript beendet den Vorgang nicht.)
E_NOTICE Laufzeitbenachrichtigung. Zeigt an, dass das Skript auf eine Situation stößt, die als Fehler angezeigt werden kann.
E_USER_NOTICE Vom Benutzer generierte Benachrichtigungsinformationen.
set_error_handler() erfasst Fehler [mit Einschränkungen]
Funktionsbeschreibung
set_error_handler($callback);//Legen Sie eine Benutzerfunktion (error_handler) fest, um An zu behandeln Im Skript ist ein Fehler aufgetreten.
Einschränkungen von Funktionen
Die folgenden Fehlerstufen können nicht von benutzerdefinierten Funktionen behandelt werden: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING und beim Aufruf von set_error_handler() Die meisten E_STRICTs werden in der Datei generiert, in der sich die Funktion befindet.
Das heißt: set_error_handler($callback) kann nur einige vom System generierte Fehler der Warn- und Hinweisebene erfassen.
Verwendungsmethode
<?phpset_error_handler("error_handler");function error_handler($errno,$errstr,$errfile,$errline){ $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF; //获取到错误可以自己处理,比如记Log、报警等等 echo $str; }echo $test;//$test未定义,会报一个notice级别的错误
Ausgabeergebnis:
"errno":8"errstr":Undefined variable: test"errfile":/Users/shuchao/Desktop/handler.php"errline":13 如何捕获PHP的Fatal Error、Parse Error等
Anforderungsbeschreibung
Erhalten Sie den schwerwiegenden Fehler von PHP, z. B. die Aufzeichnung im Protokoll, das hilfreich ist. Wir analysieren Online-Probleme und können Online-Dienste überwachen.
Zwei Funktionen
register_shutdown_function()
register_shutdown_function($callback)
register_shutdown_function(), nur die Funktion, die Sie registrieren möchten Warten Sie in [so tun, als wäre es eine Warteschlange], bis das Skript normal beendet wird oder den Aufruf zum Beenden anzeigt, und ziehen Sie dann die registrierte Funktion zur Ausführung heraus
Drei Situationen, in denen register_shutdown_function() aufgerufen wird:
Wenn das Skript normal beendet wird;
Wenn das Skript mit einem Fehler beendet wird (Laufzeit, nicht Analysezeit);
Wenn der Benutzer die Exit-Methode zum Beenden aufruft.
error_get_last()
error_get_last(); // Funktion ruft den letzten aufgetretenen Fehler ab.
Diese Funktion gibt den zuletzt aufgetretenen Fehler in Form eines Arrays zurück.
Das zurückgegebene Array enthält 4 Schlüssel und Werte:
[Typ] – Fehlertyp
[Nachricht] – Fehlermeldung
[Datei] – Datei, in der der Fehler aufgetreten ist
[Zeile] – Die Zeile, in der der Fehler aufgetreten ist
Verwendungsmethode
<?php register_shutdown_function( "fatal_handler" ); define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );function fatal_handler() { if( $error = error_get_last()) { $errno = $error["type"]; $errfile = $error["file"]; $errline = $error["line"]; $errstr = $error["message"]; $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF; //获取到错误可以自己处理,比如记Log、报警等等 echo $str; } }
Beachten Sie unbedingt, dass
register_shutdown_function( nicht aufgerufen wird, wenn ein Parse-Zeitfehler auftritt) Funktion. Register_shutdown_function() wird nur aufgerufen, wenn ein Laufzeitfehler auftritt.
Geben wir unten ein Beispiel:
NO.1
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!"; }function test(){}function test(){}
Die Ausführungsergebnisse sind wie folgt:
Schwerwiegender Fehler: test() (zuvor in /Users/shuchao/Desktop/error_handler.php:6 deklariert) in/Users/shuchao/Desktop/error_handler.php in Zeile 7 kann nicht erneut deklariert werden
Ursachenanalyse
Beim Ausführen von error_handler.php tritt in der Analysezeit von PHP (nicht zur Laufzeit) ein Fehler auf, da zwei Funktionen test() wiederholt definiert werden, sodass die Funktion in register_shutdown_function() nicht ausgeführt werden kann rief zurück.
NO.2
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!"; }if(true){ function test(){} }function test(){}
Die Ausführungsergebnisse sind wie folgt:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7Yeah,it's worked!%
Ursachenanalyse
我们看到,上面回调了register_shutdown_function().
因为我们加了一个if()判断,if()里面的test()方法,相当于一个闭包,与外面的test()名称不冲突。
也就是,上面的代码在parse-time没有出错,而是在run-time的时候出错了,所以我们能够获取到fatal error。
NO.3
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!";} test_error.php <?phpinclude './error_handler.php';function test(){}function test(){}
执行 test_error.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in/Users/shuchao/Desktop/test_error.php on line 4
原因分析
当我们在运行test_error.php的时候,因为redeclare了两个test()方法,所以php的语法解析器在parse-time的时候就出错了。 所以不能回调register_shutdown_function()中的方法,不能catch住这个fatal error。
NO.4
error_handler.php <?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!";} test_error.php <?phpfunction test(){}function test(){} include_all.php require './error_handler.php';require './test_error.php';
执行 include_all.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3Yeah,it's worked!%
结果分析
上面我们捕获了fatal_error.因为在运行include_all.php的时候,include_all.php本身语法并没有出错,也就是在parse-time的时候并没有出错,而是include的文件出错了,也就是在run-time的时候出错了,这个时候是能回调register_shutdown_function()中的函数的。
强烈建议:如果我们要使用register_shutdown_function进行错误捕捉,使用NO.4,最后一种方法,可以确保错误都能捕捉到。
更优美的写法·获取所有错误
set_error_handler()与register_shutdown_function()、error_get_last()的结合使用 <?phpregister_shutdown_function( "fatal_handler" );set_error_handler("error_handler");define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );//获取fatal errorfunction fatal_handler() { $error = error_get_last(); if($error && ($error["type"]===($error["type"] & E_FATAL))) { $errno = $error["type"]; $errfile = $error["file"]; $errline = $error["line"]; $errstr = $error["message"]; error_handler($errno,$errstr,$errfile,$errline); }}//获取所有的errorfunction error_handler($errno,$errstr,$errfile,$errline){ $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF;//获取到错误可以自己处理,比如记Log、报警等等 echo $str;} Exception Exception与Error的区别 Exception
当异常抛出的时候,我们是想要去捕获他,并去做处理的。所以异常经常被当做程序的控制流程使用。
Error
Error是不可恢复的,是在开发过程中要去解决的。
使用Exception的例子
我想执行insert语句插入一条数据,可能插入失败(比如ID重复),注意是可能失败,所以这是一个可能的情况,也就是异常情况。我们就可以使用异常来处理这个问题
try { $row->insert(); $inserted = true; } catch (Exception $e) { echo "There was an error inserting the row - ".$e->getMessage(); $inserted = false; }echo "Some more stuff";
如何catch一个未捕获的Exception
场景描述
假设程序中的有些地方直接throw了异常,没有进行catch。我们现在想要不管在程序的任何一个地方throw异常,即便在throw的地方没有被catch,我们也要能catch住,如何做到呢?
一个函数:set_exception_handler()
//设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。
set_exception_handler()
使用示例
1、exception_handler.php <?phpset_exception_handler("my_exception");function my_exception($exception){ echo $exception->getMessage();} 2、test_exception.php <?phprequire "./exception_handler.php";throw new Exception("I am Exception");
现在我们运行 test_exception.php,结果如下:
I am Exception //证明我们throw的Exception被捕获了