
クラスを使ったエラーや例外の処理についてです。
エラー(例外)処理のきほん
エラーや例外はどうやって処理するのかな?
専用のクラスを使って処理できるの
- PHPの例外処理には、Throwable throwable を実装した Exceptionクラス exception とErrorクラス error 、およびそれらの子クラスを使う(これらはPHPによって用意されている)
- 例外処理は、try, catch, finally で行う exceptions
- tryの中の例外が発生する可能性のあるコードを実行
- 例外が発生したらtryの残りの部分は飛ばして catch の中から発生した例外に一致するクラスを探して実行
- 最後に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
- ArithmeticError ・・・計算上のエラー
- Exception (Throwableから実装)
- ClosedGeneratorException ・・・ジェネレータ関係のエラー
- DOMException ・・・論理的に不可能な操作を行った
- ErrorException ・・・従来のエラーをExceptionに変換するのに使う
- IntlException ・・・国際化用拡張モジュール関係のエラー
- LogicException ・・・プログラムコードに間違いがある
- BadFunctionCallException
- BadMethodCallException
- DomainException
- InvalidArgumentException
- LengthException
- OutOfRangeException
- BadFunctionCallException
- 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 { //最後に例外発生の有無に関係なく実行する処理 ・・・ }