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