ホームページ >バックエンド開発 >PHPチュートリアル >PHP 7 エラー例外レベル
この記事では、特定の参考値を持つ PHP7 のエラー例外レベルを紹介します。必要な友達はそれを参照してください
階層
PHP の古い時代では、致命的なエラーを処理することはほとんど不可能でした。致命的なエラーは、set_error_hander() エラー ハンドラーを呼び出すことなく、スクリプトの実行を単に終了します。
PHP 7 では、致命的なエラーまたは回復可能なエラー (E_ERROR および E_RECOVERABLE_ERROR) が発生した場合、スクリプトは中止されずに例外がキャッチされます。特定の状況では、メモリ不足などの致命的なエラーが依然として発生し、スクリプトは以前と同様にすぐに終了します。キャッチされない例外は、PHP 7 でも依然として致命的なエラーです。これは、PHP 5.x でキャッチされなかった例外が、PHP 7 でも依然として致命的なエラーであることを意味します。
警告や通知などのエラーは PHP 7 でも変更されておらず、致命的なエラーまたは回復可能なエラーのみが例外をスローすることに注意してください。
致命的エラーまたは回復可能なエラーのスローは、Exception クラスから拡張されません。この分離は、既存の PHP 5.x コードがエラー例外を受け取った場合に終了ルーチンを呼び出すのを防ぐためです。致命的なエラーまたは回復可能なエラーによってスローされた例外は、新しい例外クラス Error をインスタンス化します。他の例外クラスと同様に、キャッチされた Error クラスは、最後のプログラム ブロックが実行された後に処理されます。
PHP 7 alpha-2 と比較すると、PHP 7 の例外クラス階層は異なります。スローされた致命的エラーと回復可能なエラーは EngineException クラスによってインスタンス化され、EnginException クラスは Exception を継承しません。 Exception と EngineException は両方とも BaseException を継承します。
これら 2 つの例外ブランチを結合するために、Exception と Error の両方が新しいインターフェイス Throwable を実装します。
PHP 7 の新しい例外階層は次のとおりです:
Throwable //(接口) |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error // 编译时错误 |- ArithmeticError extends Error |- pisionByZeroError extends ArithmeticError |- AssertionError extends Error
PHP 7 で Throwable インターフェイスを定義する場合、それは次のコードのようになります。
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;}
このインターフェイスには見覚えがあるはずです。 Throwable 固有のメソッドは Exception のメソッドと同じです。唯一の違いは、Throwable::getPrevious() は Throwable Exception を返し、Error クラスのコンストラクターは前の例外として Throwable のインスタンスを受け取ることです。
Throwable は、try/catch ブロックで例外またはエラー オブジェクトをキャッチするために使用できます (将来的には、さらに多くの例外タイプがキャッチされる可能性があります)。ここでは、より具体的な例外クラスをキャプチャし、適切な処理措置を講じることをお勧めします。ただし、場合によっては、例外を広範囲にキャッチする必要があります (ロギングやフレームワークのエラー処理など)。 PHP 7 では、これらの例外キャッチ ブロックは、Exception の代わりに Throwable を使用するのに適しています。
try { // Code that may throw an Exception or Error.} catch (Throwable $t) { // Handle exception}
カスタム クラスは、予測可能性と一貫性のため、Throwable プラグインを実装できません。例外をスローできるのは、Excetion クラスと Error クラスをインスタンス化する場合のみです。さらに、例外はスタック上に作成されたオブジェクトに関する情報を運びます。カスタム クラスには、情報を保持するためのパラメーターが自動的に設定されるわけではありません。
Throwable を拡張して、パッケージ固有のインターフェイスを作成したり、追加のメソッドを追加したりすることができます。Exception または Error を継承するクラスのみが、Throwable を拡張するプラグインを実装できます。
interface MyPackageThrowable extends Throwable {}class MyPackageException extends Exception implements MyPackageThrowable {}throw new MyPackageException();
PHP 5 より前のバージョンでは、すべてのエラーは致命的なエラーまたは回復可能な致命的なエラーですが、PHP 7 では、すべてのエラーがスローされます。他の例外と同様に、Error オブジェクトは try/catch ブロックを通じてキャッチできます。
$var = 1;try { $var->method(); // Throws an Error object in PHP 7.} catch (Error $e) { // Handle error}
通常、以前の致命的なエラーは Error 基本クラスのインスタンス化をスローしますが、一部のエラーはより具体的な Error サブクラス (TypeError、ParseError、AssertionError) をスローします。
TypeError インスタンス化は、関数呼び出し時に宣言された仮パラメータと実パラメータの型が一致しない場合 (受信パラメータがメソッドで定義されたパラメータの型と一致しない場合) にスローされます。 )、TypeError インスタンスをスローします。
function add(int $left, int $right){ return $left + $right; }try { $value = add('left', 'right'); } catch (TypeError $e) { echo $e->getMessage(), "\n"; }
取得された出力:
Argument 1 passed to add() must be of the type integer, string given
インクルード/必須ファイル、または eval() 内のコードに構文エラーが含まれている場合、ParseError がスローされます。
try { require 'file-with-parse-error.php'; } catch (ParseError $e) { echo $e->getMessage(), "\n"; }
Throw ArithmeticError 状況は 2 つあります: 負の変位、または PHP_INT_MIN を分子として使用し、-1 を分母として使用して intp() を呼び出します (PHP_INI_MIN / -1 の戻り値は浮動小数点型です)。 。
try { $value = 1 << -1; } catch (ArithmeticError $e) { echo $e->getMessage(), "\n"; }
分母がゼロのときに intp() または剰余 (%) を使用すると、pisionByZeroError エラーがスローされます。ゼロによる除算は警告のみを引き起こし、NaN と評価されることに注意してください。
try { $value = 1 % 0; } catch (pisionByZeroError $e) { echo $e->getMessage(), "\n"; }
assert()で設定した条件が満たされない場合、AssertionErrorがスローされます。
ini_set('zend.assertions', 1); ini_set('assert.exception', 1);$test = 1; assert($test === 0);
は、assert() で設定された条件を満たしておらず、AssertionError エラーをスローし、assert.Exception = 1 の場合、例外出力は次のようになります:
Fatal error: Uncaught AssertionError: assert($test === 0)
assert() は実行されるだけで、アサーションの場合にのみ AssertionError をスローします。有効であり、ini 設定 zend.assertions = 1 およびassert.Exception = 1 で例外をスローするように設定されています。
用户可以创建自己的 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
相关推荐:
以上がPHP 7 エラー例外レベルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。