過去には、致命的なエラーを処理することはほとんど不可能でした。
set_error_handler
によって設定されたハンドラーは呼び出されず、スクリプトは単純に完了します。
PHP 7では、致命的エラー(E_ERROR)および処理機能を備えた致命的エラー(E_RECOVERABLE_ERROR)が発生すると、例外がスローされ、スクリプトは終了しません。 ただし、「メモリ不足」などの特定のエラーは、引き続き停止します。 PHP 7でキャッチされないエラーは、PHP 5と同様に「致命的」になります。
php 7では、warinngやnoticeなどの他の種類のエラーは変更されないことに注意してください。
E_ERRORおよびE_RECOVERABLE_ERRORからスローされた例外は、
Exceptionから継承されません。 この分離は、5で記述されたコードによるこれらのエラーの処理を防ぐために行われました。 致命的なエラーの例外は、新しいクラス
Errorのインスタンスになりました。 他の例外と同様に、
エラーはキャッチされ、処理され、
最終的にブロック実行されます。
投げられる
ErrorとExceptionの両方のクラスは、新しい
Throwableインターフェイスを実装します。
新しい例外階層は次のとおりです。
interface Throwable |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error |- 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; }
このインターフェイスは使い慣れている必要があります。
スロー可能なメソッド
は 、
Exceptionメソッドとほぼ同じです。 唯一の違いは、
Throwable :: getPrevious()は
Exceptionだけでなく、任意の
Throwableインスタンスを返すことができることです。
Exceptionおよび
Errorコンストラクターは、
Throwableインスタンスを前の例外として受け入れます。
Throwableを
try / catchブロックで使用して、
Exceptionと
Error (および将来発生する可能性のある他の例外)の両方をキャッチできます。 特定のクラスの例外で例外をキャッチし、各タイプを個別に処理することをお勧めします。 ただし、例外をキャッチする必要がある場合があります。 PHP 7では、すべての例外の
try / catchブロックは
Exceptionではなく
Throwableを使用する必要があり
ます 。
try {
カスタムクラスは
Throwableを実装できません。 これは予測可能性のために行われました。
例外または
エラーインスタンスのみがスローされます。 さらに、例外には
スタックトレースでオブジェクトが作成された場所に関する情報が含まれ
ます 。 カスタムクラスには、この情報を保存するために必要なパラメーターがありません。
エラー
PHP 5.xおよびPHP 7のほとんどすべてのエラー(E_ERROR、E_RECOVERABLE_ERROR)は、
Errorのインスタンスによってスローされます。 他の例外と同様に、
エラーはtry / catchブロックを使用してキャッチできます。
try { $undefined->method();
PHP 7のPHP 5.xで「致命的」だったエラーのほとんどは、単純な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"; }
ParseError
evalの
include(require / require )ファイルまたはコードに構文エラーが含まれている場合、
ParseErrorがスローされます。
try { require 'file-with-parse-error.php'; } catch (ParseError $e) { echo $e->getMessage(), "\n"; }
AssertionError
assert()メソッドで指定された条件が満たされない場合、
AssertionErrorがスローされます。
ini_set('zend.assertions', 1); ini_set('assert.exception', 1); $test = 1; assert($test === 0);
Fatal error: Uncaught AssertionError: assert($test === 0)
assert()メソッドが実行され、設定で有効になっている場合にのみ
AssertionErrorがスローされます:
zend.assertions = 1および
assert.exception = 1 。
コードでエラーを使用する
Errorクラスを使用し、
Errorクラスの独自の階層を作成して
Errorを拡張することもできます。 これは、どの例外が例外をスローすべきか、どの
エラーかという疑問を投げかけ
ます 。
エラーは、プログラマーの注意を必要とするコード内の問題(間違ったタイプの入力エラーや構文エラーなど)を示すために使用する必要があります。
例外を「安全に」処理でき、プログラムの実行を続行できる場合は、例外を使用する必要があります。
Errorオブジェクトはプログラム実行中に処理できないため、
Errorをキャッチすることはまれです。 一般に、
エラーは、ログの記録、必要な「データのクレンジング」、およびユーザーへのエラー表示のためにのみ捕捉する必要があります。
PHP 5.xとPHP 7の両方で例外をキャッチする
1つのコードを使用してphp 5.xとphp 7の両方で例外を
キャッチするには、まず
Throwableをキャッチし、次に
Exceptionをキャッチする複数の
catchブロックを使用し
ます 。 PHP 5.xのサポートが不要になったら、
Exception catchブロックを削除するだけです。
try {