PHP - 例外

Throwables インターフェース

PHPでは、例外は特定のエラーがコード内で発生したときに投げられるオブジェクトとして表現されます。PHPは、すべての例外とエラーの基底クラスである Throwable インターフェースを提供しており、例外を効果的に処理するための複数のメソッドを持っています。

PHP - Exceptions

基本的な例外処理

PHPで例外を処理するには、try-catch ブロックを使用できます。以下はその例です:

<?php
try {
// 例外を投げる可能性のあるコード
throw new Exception("エラーが発生しました!");
} catch (Exception $e) {
// 例外を処理するコード
echo "例外をキャッチしました: " . $e->getMessage();
}
?>

この例では、throw 文を使用して新しい Exception オブジェクトを作成し、カスタムメッセージを設定します。try ブロック内で例外が投げられた場合、コードの実行は対応する catch ブロックにジャンプし、そこで例外をキャッチして処理します。

set_exception_handler

set_exception_handler 関数を使用すると、未捕獲の例外が投げられたときに呼び出されるカスタム関数を定義できます。この関数には、例外オブジェクトと eval() 呼び出しならがら例外が投げられたかどうかを示すブール値が渡されます。

以下は set_exception_handler の使用例です:

<?php
function myExceptionHandler($exception) {
echo "未捕獲の例外: " . $exception->getMessage();
}

set_exception_handler('myExceptionHandler');

// 例外を投げるコード
throw new Exception("ああ!何かが間違いました。");
?>

この例では、カスタム例外処理関数 myExceptionHandler を定義し、set_exception_handler を使用してこの関数をデフォルトの例外処理関数として設定します。未捕獲の例外が投げられた場合、デフォルトの関数ではなくこのカスタム関数が呼び出されます。

SPL 例外

PHPは、標準PHPライブラリ(SPL)内にいくつかのビルトイン例外クラスを提供しており、これらのクラスは Exception クラスを拡張し、異なる種類の例外に関するより具体的な情報を提供します。以下は一般的なSPL例外のいくつかです:

  • BadFunctionCallException:コールバックが未定義の関数を参照する場合や、引数が不足している場合に投げられます。
  • DomainException:アプリケーションのドメインロジックにおけるエラーに使用されます。
  • InvalidArgumentException:関数に受け入れられない引数が渡された場合に発生します。
  • LengthException:操作が誤った長さのオブジェクトを使用しようとした場合に使用されます。
  • OutOfBoundsException:配列のインデックスが範囲外の場合に投げられます。
  • OutOfRangeException:値が期待される範囲外の場合に発生します。
  • RangeException:値が指定された範囲外の場合に使用されます。
  • RuntimeException:ランタイムエラーの一般的目的のための例外です。
  • UnderflowException:アンダーフローが発生した場合に投げられます(例:空のスタックから引く)。
  • UnexpectedValueException:値が期待される型に一致しない場合に発生します。

これらのSPL例外は、他の例外クラスと同様にコード内で使用できます。例えば:

<?php
function divide($a, $b) {
if ($b == 0) {
throw new DivisionByZeroError("ゼロで除算は許可されていません。");
}
return $a / $b;
}

try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "例外をキャッチしました: " . $e->getMessage();
}
?>

ユーザー定義の例外

ビルトインのSPL例外を使用するだけでなく、カスタムの例外クラスを作成することもできます。そのためには、Exception クラスを拡張し、必要な追加機能を追加します。以下はその例です:

<?php
class MyCustomException extends Exception {
public function __construct($message, $code = 0, Exception $previous = null) {
parent::__construct($message, $code, $previous);
}
}

try {
throw new MyCustomException("これはカスタム例外です。");
} catch (MyCustomException $e) {
echo "カスタム例外をキャッチしました: " . $e->getMessage();
}
?>

この例では、MyCustomException という新しいクラスを作成し、Exception クラスを拡張します。その後、このカスタム例外を投げてキャッチする方法を示しています。

これらのガイドラインに従い、提供されたツールを使用することで、PHPコード内で例外を効果的に処理し、予期せぬエラーに対してアプリケーションが強固で耐性を持つことを確保できます。コードを彻底にテストし、例外を適切に処理することで、ユーザー体験を向上させることができます。

Credits: Image by storyset