Throwable エラー

Throwable エラーとは、実行中に発生し、 通常の命令の流れを中断するイベントです。 Throwable エラーがエンジンによって、または手動で throw されると、 catch ブロックでキャッチされるか、グローバルスコープに達するまで、 コールスタックが巻き戻されます。 グローバルスコープに達した場合、プログラムは致命的なエラーで終了します。 どちらの場合も、コールスタックを巻き戻す途中で見つかったすべての finally ブロックが実行されます。

PHP のコードから Throwable エラーをスローするには、 throw キーワードの後に、Error クラスか Exception クラス、 またはそのいずれかのサブクラスのインスタンスを指定しなければなりません。 それ以外のオブジェクトをスローしようとすると、 Cannot throw objects that do not implement Throwable というメッセージとともに Error がスローされます。

ヒント

Standard PHP Library (SPL) には、 さまざまな組み込みの例外が用意されています。 また、Exception クラスを拡張することで、独自の例外を作成することもできます。

エラーをスローする可能性のあるコードを try ブロックで囲むと、 Throwable エラーを PHP のコード内で処理できます。 try ブロックには、対応する catch ブロックあるいは finally ブロックが ひとつ以上必要です。

注意:

Error オブジェクトはプログラミング上のエラーを示すものなので、 キャッチすることは推奨されません。

警告

Throwable オブジェクトはクローンできません。 このようなオブジェクトを clone しようとすると、 Trying to clone an uncloneable object of class Exception というメッセージとともに Error がスローされます。 これは、サブクラスが独自の __clone() メソッドを宣言していても同様です。

グローバルな例外ハンドラ

set_exception_handler() を使うと、 キャッチされないあらゆる Throwable を処理するハンドラを設定できます。 これはコード全体を try-catch ブロックで囲むのと似ていますが、 その後に実行が再開されない点が異なります。 ハンドラから処理が戻った時点で、スクリプトは終了します。

例外を拡張する

ユーザー定義の例外は、組み込みの Exception クラスを拡張して定義できます。

組み込みの Exception クラスを拡張したクラスで コンストラクタを再定義する場合、 利用可能なすべてのデータが正しく代入されるように、 parent::__construct() もコールすることを強く推奨します。 __toString() メソッドをオーバーライドすると、 オブジェクトが文字列として使われたときの出力を独自に定義できます。

例1 Exception を拡張する

<?php
class CustomException extends Exception
{
    // コンストラクタを再定義し、メッセージを必須にする
    public function __construct($message, $code = 0, ?Throwable $previous = null) {
        // 何らかのコード

        // すべてを正しく確実に代入する
        parent::__construct($message, $code, $previous);
    }

    // オブジェクトの文字列表現を独自に定義する
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }

    public function customFunction() {
        echo "A custom function for this type of exception\n";
    }
}

try {
    throw new CustomException("Something happened", 5);
} catch (CustomException $e) {
    echo "Caught custom exception\n", $e;
    $e->customFunction();
}

上の例の出力は以下となります。

Caught custom exception
CustomException: [5]: Something happened
A custom function for this type of exception

Throwable の階層

Exception クラスには多くのサブクラスがあり、 その中には SPL の例外や、 拡張モジュールが定義する例外が含まれます。

+add a note

User Contributed Notes

There are no user contributed notes for this page.