PHP 7-Fehlerausnahmestufe

不言
Freigeben: 2023-03-23 22:28:01
Original
2316 Leute haben es durchsucht

Der Inhalt dieses Artikels handelt von der PHP7-Fehlerausnahmestufe, die einen bestimmten Referenzwert hat. Jetzt kann ich ihn mit allen teilen, die ihn brauchen.

PHP7-Fehlerausnahmestufe


Untersuchung der Ausnahmehierarchie in PHP 7

In der Vergangenheit war es fast unmöglich, schwerwiegende Fehler in PHP zu behandeln. Schwerwiegende Fehler beenden einfach die Skriptausführung, ohne den Fehlerhandler set_error_hander() aufzurufen.

Wenn in PHP 7 schwerwiegende oder behebbare Fehler (E_ERROR und E_RECOVERABLE_ERROR) auftreten, wird die Ausnahme abgefangen, anstatt das Skript abzubrechen. Unter Umständen kommt es dennoch zu schwerwiegenden Fehlern, wie z. B. zu wenig Speicher, und das Skript wird wie bisher sofort beendet. Nicht abgefangene Ausnahmen sind in PHP 7 immer noch schwerwiegende Fehler. Das bedeutet, dass eine nicht abgefangene Ausnahme in PHP 5.x immer noch ein schwerwiegender Fehler in PHP 7 ist.

Beachten Sie, dass Fehler wie Warnungen oder Benachrichtigungen in PHP 7 unverändert bleiben und nur schwerwiegende oder behebbare Fehler Ausnahmen auslösen.

Das Auslösen schwerwiegender oder behebbarer Fehler erstreckt sich nicht über die Exception-Klasse. Durch diese Trennung soll verhindert werden, dass vorhandener PHP 5.x-Code die Beendigungsroutine aufruft, wenn er eine Fehlerausnahme empfängt. Ausnahmen, die durch schwerwiegende oder behebbare Fehler ausgelöst werden, instanziieren eine neue Ausnahmeklasse: Fehler. Wie andere Ausnahmeklassen wird die abgefangene Fehlerklasse nach der Ausführung des letzten Programmblocks verarbeitet.

Im Vergleich zu PHP 7 Alpha-2 ist die Ausnahmeklassenhierarchie von PHP 7 anders. Die ausgelösten schwerwiegenden und behebbaren Fehler werden in der EngineException-Klasse instanziiert, und die EnginException-Klasse erbt nicht von Exception . Sowohl Exception als auch EngineException erben von BaseException.

Throwable

Um diese beiden Ausnahmezweige zu kombinieren, implementieren sowohl Exception als auch Error eine neue Schnittstelle, Throwable.

Die neue Ausnahmehierarchie in PHP 7 lautet wie folgt:

Throwable //(接口)
    |- Exception implements Throwable
        |- ...
    |- Error implements Throwable
        |- TypeError extends Error 
        |- ParseError extends Error // 编译时错误
        |- ArithmeticError extends Error
            |- pisionByZeroError extends ArithmeticError
        |- AssertionError extends Error
Nach dem Login kopieren

Wenn Sie die Throwable-Schnittstelle in PHP 7 definieren, sollte sie dem folgenden Code ähneln.

interface Throwable{
    public function getMessage(): string;
    public function getCode(): int;
    public function getFile(): string;
    public function getLine(): int;
    public function getTrace(): array;
    public function getTraceAsString(): string;
    public function getPrevious(): Throwable;
    public function __toString(): string;}
Nach dem Login kopieren

Diese Schnittstelle sollte bekannt sein. Throwable-spezifische Methoden sind die gleichen wie die von Exception. Der einzige Unterschied besteht darin, dass Throwable::getPrevious() eine Throwable-Ausnahme zurückgibt und der Konstruktor der Error-Klasse eine Instanz von Throwable als vorherige Ausnahme erhält.

Throwable kann verwendet werden, um Ausnahmen oder Fehlerobjekte in Try/Catch-Blöcken abzufangen (möglicherweise werden in Zukunft weitere Ausnahmetypen abgefangen). Denken Sie daran, dass hier empfohlen wird, spezifischere Ausnahmeklassen zu erfassen und entsprechende Behandlungsmaßnahmen zu ergreifen. In einigen Fällen ist es jedoch erforderlich, Ausnahmen umfassend abzufangen (z. B. bei der Protokollierung oder der Fehlerbehandlung des Frameworks). In PHP 7 eignen sich diese Blöcke zum Abfangen von Ausnahmen besser für die Verwendung von Throwable anstelle von Exception.

try {    // Code that may throw an Exception or Error.} catch (Throwable $t) {    // Handle exception}
Nach dem Login kopieren

Benutzerdefinierte Klassen können keine Throwable-Plug-Ins implementieren, teilweise aufgrund der Vorhersehbarkeit und Konsistenz: Nur die Instanziierung der Excetion- und Error-Klassen kann Ausnahmen auslösen. Darüber hinaus enthalten Ausnahmen Informationen zu den Objekten, die auf dem Stapel erstellt wurden. Benutzerdefinierte Klassen verfügen nicht automatisch über Parameter zum Speichern von Informationen.

Throwable kann erweitert werden, um paketspezifische Schnittstellen zu erstellen oder zusätzliche Methoden hinzuzufügen. Nur Klassen, die Exception oder Error erben, können Plug-Ins implementieren, die Throwable erweitern.

interface MyPackageThrowable extends Throwable {}class MyPackageException extends Exception implements MyPackageThrowable {}throw new MyPackageException();
Nach dem Login kopieren

Fehler

In PHP 5. und niedriger sind alle Fehler schwerwiegende Fehler oder behebbare schwerwiegende Fehler, während in PHP 7 alle Fehler ausgegeben werden. Wie andere Ausnahmen können Error-Objekte durch Try/Catch-Blöcke abgefangen werden.

$var = 1;try {
    $var->method(); // Throws an Error object in PHP 7.} catch (Error $e) {    // Handle error}
Nach dem Login kopieren

Normalerweise lösen frühere schwerwiegende Fehler eine Instanziierung der Error-Basisklasse aus, einige Fehler lösen jedoch spezifischere Error-Unterklassen aus: TypeError, ParseError und AssertionError.

TypeError (Typfehler)

TypeError-Instanziierung wird durch die tatsächlichen Parameter und formalen Parameter ausgelöst. Wenn die Funktion aufgerufen wird, sind die formalen Parameter und tatsächlichen Parametertypen inkonsistent (in den Parametern und Die übergebenen Methoden (die definierten Parametertypen sind inkonsistent) lösen eine TypeError-Instanz aus.

function add(int $left, int $right){
    return $left + $right;
}try {    $value = add('left', 'right');
} catch (TypeError $e) {    echo $e->getMessage(), "\n";
}
Nach dem Login kopieren

Resultierende Ausgabe:

Argument 1 passed to add() must be of the type integer, string given
Nach dem Login kopieren

ParseError (Analysefehler)

Wenn die enthaltene/erforderliche Datei oder der Code in eval() einen Syntaxfehler enthält , ParseError wird geworfen.

try {    require 'file-with-parse-error.php';
} catch (ParseError $e) {    echo $e->getMessage(), "\n";
}
Nach dem Login kopieren

ArithmeticError (Arithmetikfehler)

Throw ArithmeticError Es gibt zwei Fälle von Fehlern: negative Verschiebung oder Verwendung von PHP_INT_MIN als Zähler und -1 als Nenner zum Aufrufen von intp(). (PHP_INI_MIN / -1 Der Rückgabewert ist ein Gleitkommatyp).

try {    $value = 1 << -1;
} catch (ArithmeticError $e) {    echo $e->getMessage(), "\n";
}
Nach dem Login kopieren

pisionByZeroError (Nenner ist Null)

Die Verwendung von intp() oder Rest (%), wenn der Nenner Null ist, löst einen pisionByZeroError-Fehler aus. Beachten Sie, dass eine Division durch Null nur eine Warnung auslöst und NaN ergibt.

try {    $value = 1 % 0;
} catch (pisionByZeroError $e) {    echo $e->getMessage(), "\n";
}
Nach dem Login kopieren

AssertionError (Assertion)

Wenn die durch „asser()“ festgelegten Bedingungen nicht erfüllt sind, wird ein AssertionError ausgelöst.

ini_set(&#39;zend.assertions&#39;, 1);
ini_set(&#39;assert.exception&#39;, 1);$test = 1;

assert($test === 0);
Nach dem Login kopieren

Wenn die von „asser()“ festgelegten Bedingungen nicht erfüllt sind, wird ein AssertionError ausgelöst und Assertion.Exception = 1. Die Ausnahmeausgabe lautet wie folgt:

Fatal error: Uncaught AssertionError: assert($test === 0)
Nach dem Login kopieren

assert () wird nur ausgeführt und löst nur dann einen AssertionError aus, wenn Assertionen aktiviert und so eingestellt sind, dass sie Ausnahmen mit den INI-Einstellungen zend.assertions = 1 und Assertion.Exception = 1 auslösen.

使用 Error

用户可以创建自己的 Error 类,作为 Error 基类的拓展。这可能带来重要的问题:什么场合下应该抛出一个 Exception 类的子类实例,什么场合下又应该抛出 Error 类的子类实例?

由于错误对象不应当在程序运行中处理,捕获错误对象应当是少见的。通常而言,错误对象应当捕获并记录之,执行必要的清理,并给用户展示错误信息。

编写兼容 PHP 5.x 和 7 Exceptions 类的代码

在 PHP 5.x 和 7 使用相同的代码捕获异常,可以实用多重捕获代码块,首先捕获 Throwable,之后时 Exception。一旦不需要维护 PHP 5.x 的系统,代码块可以立刻被清理掉。

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

英文原文: trowski.com/2015

本文虽拙,却也系作者劳动,转载还请保留本文链接: http://cyleft.com/?p=721

相关推荐:

php错误级别详解

PHP错误与异常调试视频教程资源分享

Das obige ist der detaillierte Inhalt vonPHP 7-Fehlerausnahmestufe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage