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

Zusammenfassung der PHP-Fehler und Ausnahmen

Oct 20, 2016 pm 02:07 PM
php

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级别的错误
Nach dem Login kopieren

Ausgabeergebnis:

"errno":8"errstr":Undefined variable: test"errfile":/Users/shuchao/Desktop/handler.php"errline":13
如何捕获PHP的Fatal Error、Parse Error等
Nach dem Login kopieren

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;
  }
}
Nach dem Login kopieren

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(){}
Nach dem Login kopieren

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(){}
Nach dem Login kopieren

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!%
Nach dem Login kopieren

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(){}
Nach dem Login kopieren

执行 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
Nach dem Login kopieren

原因分析

当我们在运行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;;
Nach dem Login kopieren

执行 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!%
Nach dem Login kopieren

结果分析

上面我们捕获了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
Nach dem Login kopieren

当异常抛出的时候,我们是想要去捕获他,并去做处理的。所以异常经常被当做程序的控制流程使用。

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";
Nach dem Login kopieren

如何catch一个未捕获的Exception

场景描述

假设程序中的有些地方直接throw了异常,没有进行catch。我们现在想要不管在程序的任何一个地方throw异常,即便在throw的地方没有被catch,我们也要能catch住,如何做到呢?

一个函数:set_exception_handler()

//设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。

set_exception_handler()
Nach dem Login kopieren

使用示例

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");
Nach dem Login kopieren

现在我们运行 test_exception.php,结果如下:

I am Exception //证明我们throw的Exception被捕获了
Nach dem Login kopieren


Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

See all articles