PHPでの例外について

例外クラス

← 親クラス   子クラス →
概要
Exceptionすべての例外の基底クラス。
ErrorExceptionエラー例外。
LogicExceptionロジックの誤り。
BadFunctionCallException関数呼び出しの問題(未実装、引数不足等)
BadMethodCallExceptionメソッド呼び出しの問題(未実装、引数不足等)
DomainException型は正しいが値が不正。
InvalidArgumentException引数の型が不正。
LengthException長さが不正。
OutOfRangeException無効なインデックス。
RuntimeException実行時の問題。
OutOfBoundsException配列・連想配列のキーが不正。
OverflowExceptionこれ以上要素を追加できない。
PDOExceptionPDOに関わる問題。
RangeException型は正しいが、値が不正。
UnderflowExceptionこれ以上要素を削除できない。
UnexpectedValueException戻り値が不正。

独自の例外クラス

独自の例外クラスを作成するなら、次の要件に従っておくと良い。

  1. Exceptionクラスを継承すること。
  2. クラス名の接尾辞はExceptionとすること。
  3. アプリが複数の例外を持つ場合には、アプリ独自例外を意味するインターフェイスを用意しておき、他の例外はこれを実装すること。(クラスへのタグ付けを目的としたインターフェイスのことをマーカーインターフェイスと呼んだりする)

privateメソッドではassert文をtry-catch文の代わりに使う

privateメソッドのように、呼び出し元が特定されていて信用できる場合は、
検査 + 例外スローの手続きは不要。
代わりにassert文で引数が満たすべき条件を宣言すると良い。
assert命令は条件が満たされていない場合に、エラー・警告を投げる。

下記が使用例

<?php
function getTest(int $i1, int $i2) : int {
    assert($i1 > 0 && $i2 > 0);
    return $i1 + $i2;
}

assert文はphp.iniで動作を変更できる。(下記はphp.iniでの項目と概要)

  • zend.assertions
    assert文を有効にするかどうかを決定する。
    設定値 → 1:コードを生成して実行(開発モード。既定)
    設定値 → 0:コードを生成するが、実行時にはスキップ。
    設定値 → -1:コードを生成しない(本番モード)
  • assert.exception
    例外を投げるかどうか決定する。
    設定値 → 0:警告を生成(PHP 7.4 以前の既定)
    設定値 → 1:AssertError または 引数$description の例外をスロー(PHP 8 以降の既定)

コメント

タイトルとURLをコピーしました