PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHP 7の例外とエラー ― Throwableインターフェースによる統一的なエラーハンドリング

PHP 7より前のバージョンでは、例外(Exception)だけをハンドリングすることができ、エラー(Error)を捕捉することは不可能でした。致命的なエラー(Fatal Error)が発生すると、アプリケーション全体、あるいはその一部が強制的に停止してしまうという問題がありました。

この課題を解決するために、PHP 7ではThrowableインターフェースが新たに導入され、例外とエラーの両方を統一的に処理できるようになりました。

Exception(例外)とは

致命的かつ回復可能なエラーが発生した場合、PHP 7はアプリケーションやスクリプトの実行を完全に停止させる代わりに、例外をスローします。これにより、開発者はエラー発生後も処理を継続できるようになります。

Error(エラー)とは

PHP 7では、TypeErrorArithmeticErrorParserErrorAssertionErrorといったErrorオブジェクトがスローされます。一方、警告(Warning)や通知(Notice)レベルのエラーについては、従来の挙動から変更されていません。

try/catchブロックを使用すればErrorインスタンスも捕捉できるようになり、Fatal ErrorもErrorインスタンスとしてスローされます。Throwableインターフェースは、ExceptionとErrorという2つの系統を統合し、どちらもthrowableとして実装できるようにした仕組みです。

サンプルコード:Errorの捕捉

<?php
    class XYZ {
        public function Hello() {
            echo "class XYZ\n";
        }
    }
    try {
        $a = new XYZ();
        $a->Hello();
        $a = null;
        $a->Hello();
    }
    catch (Error $e) {
        echo "Error occurred". PHP_EOL;
        echo $e->getMessage() . PHP_EOL ;
        echo "File: " . $e->getFile() . PHP_EOL;
        echo "Line: " . $e->getLine(). PHP_EOL;
    }
    echo "Continue the PHP code\n";
?>

出力結果

上記のプログラムを実行すると、次のような結果が得られます。

class XYZ
Error occurred
Call to a member function Hello() on null
File: /home/cg/root/9008538/main.php
Line: 11
Continue with the PHP code

ポイント:この例では、nullになったオブジェクトに対してメソッドを呼び出しています。catchブロックがエラーを捕捉して適切に処理することで、その後のPHPコードを引き続き実行できています。

ArithmeticError(算術エラー)

算術エラーの一種であるDivisionByZeroErrorを利用してみましょう。整数除算関数intdiv()でゼロ除算を行うとDivisionByZeroErrorがスローされますが、通常の除算演算子(/)を使用した場合には、依然として警告(Warning)が発生する点に注意してください。

サンプルコード:算術エラー

<?php
    $x = 10;
    $y = 0;
    try {
        $z = intdiv($x , $y);
    }
    catch (DivisionByZeroError $e) {
        echo "Error has occured\n";
        echo $e->getMessage() . PHP_EOL ;
        echo "File: " . $e->getFile() . PHP_EOL;
        echo "Line: " . $e->getLine(). PHP_EOL;
    }
    echo "$z \n";
    echo " continues with the PHP code\n";
?>

出力結果

上記プログラムの出力は次のとおりです。

Division by zero
File: /home/cg/root/9008538/main.php
Line: 5
continues with the PHP code

ポイント:上記のプログラムでは、intdiv()関数内で発生したDivisionByZeroErrorをcatchブロックで捕捉し、エラーメッセージ・ファイル名・行番号を報告しています。

まとめ

PHP 7のThrowableインターフェースの登場により、従来は捕捉できなかったFatal Errorもtry/catchで扱えるようになりました。ExceptionとErrorの階層構造を正しく理解しておくことで、予期しないエラーでアプリケーションが停止するリスクを減らし、より堅牢なエラーハンドリングを実装できます。

  1. PHPのuser_error()関数とは?使い方とサンプルコードを解説

    user_error() 関数は、PHP の trigger_error() 関数のエイリアス(別名)です。ユーザーが任意にエラー条件を発生させるために使用され、PHP 組み込みのエラーハンドラと組み合わせることも、set_error_handler() で登録したユーザー定義のエラーハンドラ関数と併用することもできます。 なお、この関数は trigger_error() と完全に同じ動作をするため、現在では可読性の観点から trigger_error() を使うことが推奨されています。 構文 user_error(error_msg, error_type) パラメータ error_msg

  2. PHPのerror_get_last()関数とは?使い方と実行例をわかりやすく解説

    error_get_last()関数は、PHPスクリプト内で最後に発生したエラーを連想配列として取得するための組み込み関数です。エラーログを出力せずに、プログラム側で直近のエラー内容を確認したい場合に便利な関数です。 取得できる連想配列のキー この関数が返す連想配列には、次の4つのキーが含まれています。 type — エラーの種類(型)を表す message — エラーメッセージの内容を表す file — エラーが発生したファイル名を表す line — エラーが発生した行番号を表す 構文(シンタックス) error_get_last() パラメータ この関数にはパラメータはありません。 戻