Heim  >  Artikel  >  类库下载  >  Zusammenfassung der PHP-Fehler und Ausnahmen

Zusammenfassung der PHP-Fehler und Ausnahmen

高洛峰
高洛峰Original
2016-10-20 14:07:171314Durchsuche

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(&#39;E_FATAL&#39;,  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&#39;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&#39;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&#39;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&#39;s worked!";}
test_error.php
<?phpinclude &#39;./error_handler.php&#39;;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&#39;s worked!";}
test_error.php
<?phpfunction test(){}function test(){}
include_all.php
require &#39;./error_handler.php&#39;;require &#39;./test_error.php&#39;;

执行 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&#39;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(&#39;E_FATAL&#39;,  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被捕获了


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

In Verbindung stehende Artikel

Mehr sehen