カテゴリー
PHP

PHP7(8)エラーや例外の処理

クラスを使ったエラーや例外の処理についてです。


エラー(例外)処理のきほん

エラーや例外はどうやって処理するのかな?

専用のクラスを使って処理できるの

  • PHPの例外処理には、Throwable  throwable  を実装した Exceptionクラス  exception  とErrorクラス  error  、およびそれらの子クラスを使う(これらはPHPによって用意されている)
  • 例外処理は、try, catch, finally で行う  exceptions 
    1. tryの中の例外が発生する可能性のあるコードを実行
    2. 例外が発生したらtryの残りの部分は飛ばして catch の中から発生した例外に一致するクラスを探して実行
    3. 最後にfinally節に移動して実行
  • 強制的に例外を発生させたいときは throw を使う。
  • 発生した例外の種類に応じて例外処理の方法を変えたいときは、ExceptionクラスやErrorクラスを継承した種類別の子クラスを使う  exceptions 
  • エラーメッセージの表示やエラーコードを使った処理には、これらのクラスに用意されている getMessage() や getCode() などのメソッドを使う。
  • PHPが出すエラーレベルを設定したいときは error_reporting(定数); を使用する  error_reporting 
    • 設定に使用するエラーレベルの定数は E_XXXXX のような形式。これらはPHPであらかじめ用意されている  constants 
    • エラーレベルの定数は、ビット演算でビットマスクを作って指定できるようになっている。例:error_reporting(E_ERROR | E_WARNING | E_PARSE);
  • PHPがエラーを出すか出さないか切り替えるには ini_set('display_errors', 1); とする  ini_set 
    • エラー出力のON/OFFは本来 php.ini を書き換えて行う。
    • ini_set('php.iniでの設定名',設定値); とすれば php.ini の設定を書き換えずに一時的に設定を切り替えられる(PHPの処理が終わると元の値に戻ります)
  • 独自の例外クラスを作成したいときは、Exceptionクラスを継承して作成する  extending 

try , catch , finally のきほん

finally ってどっちにしても必ず実行されちゃうんですね

try { 実行時エラーが起きる可能性のあるコードブロック; }
catch (エラーに対応したクラス名1 $e) { エラー時の処理; } 
catch (エラーに対応したクラス名2 $e) { エラー時の処理; } 
catch (エラーに対応したクラス名3 $e) { エラー時の処理; } 
finally { エラーが発生してもしなくても処理するコード; }

Errorクラス , Exceptionクラス の子クラス一覧  exceptions 

いろいろなクラスがあらかじめ用意されています

  • Error (Throwableから実装)
    • ArithmeticError ・・・計算上のエラー
      • DivisionByZeroError
    • AssertionError ・・・assert() によるassertionが失敗
    • ParseError ・・・eval() などのPHPコードのパースに失敗
    • TypeError ・・・関数の引数の型,返値の型,引数の数などが合わない
      • ArgumentCountError
  • Exception (Throwableから実装)
    • ClosedGeneratorException ・・・ジェネレータ関係のエラー
    • DOMException ・・・論理的に不可能な操作を行った
    • ErrorException ・・・従来のエラーをExceptionに変換するのに使う
    • IntlException ・・・国際化用拡張モジュール関係のエラー
    • LogicException ・・・プログラムコードに間違いがある
      • BadFunctionCallException
        • BadMethodCallException
      • DomainException
      • InvalidArgumentException
      • LengthException
      • OutOfRangeException
    • PharException ・・・PHPアーカイブ関係のエラー
    • ReflectionException ・・・コード情報を提供する Reflection API関係のエラー
    • RuntimeException ・・・ランタイムエラー
      • OutOfBoundsException
      • OverflowException
      • PDOException
      • RangeException
      • UnderflowException
      • UnexpectedValueException
    • SodiumException  ・・・暗号関係のエラー

try , catch , finally の例

たとえばこんな風に記述するの

//基本的な書き方
ini_set('display_errors', 1);
error_reporting(E_ALL);

try {
    ・・・
    //強制的に例外を発生させるときは throw をつかう
    //エラーコードは渡したい値を独自に決めて使えばよい
    throw new 例外クラス名('エラーメッセージ', エラーコード);
}
catch (例外クラス名 $e) {
    //例外発生時に行う処理
    ・・・
    echo $e->getMessage() , $e->getCode();
}
finally {
    //最後に例外発生の有無に関係なく実行する処理
    ・・・
}
//すべてのエラー(例外)処理をまとめて行う
//(Throwableでcatchする)
try {
    ・・・
    //強制的に例外を発生させるときは throw をつかう
    //エラーコードは渡したい値を独自に決めて使えばよい
    throw new Exception('エラーメッセージ', エラーコード);
}
catch (Throwable $e) {
    //例外発生時に行う処理
    ・・・
    echo $e->getMessage() , $e->getCode();
}
finally {
    //最後に例外発生の有無に関係なく実行する処理
    ・・・
}
//Error(エラー) と Exception(例外) を分けて処理したい
try {
    ・・・
}
catch (Error $e) {
    ・・・
}
catch (Exception $e) {
    ・・・
}
finally {
    //最後に例外発生の有無に関係なく実行する処理
    ・・・
}