Der Inhalt dieses Artikels handelt von der PHP7-Fehlerausnahmestufe, die einen bestimmten Referenzwert hat. Jetzt kann ich ihn mit allen teilen, die ihn brauchen.
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.
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
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;}
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}
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();
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}
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-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"; }
Resultierende Ausgabe:
Argument 1 passed to add() must be of the type integer, string given
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"; }
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"; }
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"; }
Wenn die durch „asser()“ festgelegten Bedingungen nicht erfüllt sind, wird ein AssertionError ausgelöst.
ini_set('zend.assertions', 1); ini_set('assert.exception', 1);$test = 1; assert($test === 0);
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)
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 基类的拓展。这可能带来重要的问题:什么场合下应该抛出一个 Exception 类的子类实例,什么场合下又应该抛出 Error 类的子类实例?
由于错误对象不应当在程序运行中处理,捕获错误对象应当是少见的。通常而言,错误对象应当捕获并记录之,执行必要的清理,并给用户展示错误信息。
在 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}
英文原文: trowski.com/2015
本文虽拙,却也系作者劳动,转载还请保留本文链接: http://cyleft.com/?p=721
相关推荐:
Das obige ist der detaillierte Inhalt vonPHP 7-Fehlerausnahmestufe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!