PHPにおける例外処理

PHPの処理においてエラー等が発生すると、例外がスローされる。スローされた例外をキャッチ(補足)して例外処理を行うことができる。

例外の種類

PHPの例外には、次に示す種類がある。

Exception
全てのユーザ例外の基底クラス
ErrorException
エラー例外
Error
全ての内部エラーの基底クラス
ArgumentCountError
ユーザー定義の関数あるいはメソッドに渡された引数が少なすぎる場合にスローされる。
ArithmeticError
数学的な操作でエラーが発生した場合にスローされる。
AssertionError
assert() によるアサーションが失敗したときにスローされる。
DivisionByZeroError
数値をゼロで割ろうとした場合にスローされる。
CompileError
コンパイルエラーが起きた時にスローされる。
ParseError
eval() を呼んだときなどの PHP コードのパースに失敗した場合にスローされる。
TypeError
型と一致しない場合にスローされる。
ValueError
値が正しくない場合にスローされる。
UnhandledMatchError
match 式がどの分岐でも処理できなかったことを検知した場合にスローされる。
BadFunctionCallException
未定義の関数をコールバックが参照したり、引数を指定しなかったりした場合にスローされる。
BadMethodCallException
未定義のメソッドをコールバックが参照したり、引数を指定しなかったりした場合にスローされる。
DomainException
定義したデータドメインに値が従わないときにスローされる。
InvalidArgumentException
引数の型が期待する型と一致しなかった場合にスローされる。
LengthException
長さが無効な場合にスローされる。
LogicException
プログラムのロジック内でのエラーを表す。
OutOfBoundsException
値が有効なキーでなかった場合にスローされる。
OutOfRangeException
無効なインデックスを要求した場合にスローされる。
OverflowException
いっぱいになっているコンテナに要素を追加した場合にスローされる。
RangeException
プログラムの実行時に範囲エラーが発生したことを示すときにスローされる。
RuntimeException
実行時にだけ発生するようなエラーの際にスローされる。
UnderflowException
空のコンテナ上で無効な操作を試みたときにスローされる。
UnexpectedValueException
いくつかの値のセットに一致しない値であった際にスローされる。

Exception

Exceptionは、PHPにおける全てのユーザ例外の基底クラスである。

Exceptionクラスは次に示すメソッドを持つ。

Exceptionクラスのメソッド
メソッド説明
getMessage() 例外メッセージを返す。
getPrevious() 前の例外を返す。
getCode() 例外コードを取得する。
getFile 例外が発生したファイルを取得する。
getLine() 例外が発生した行を取得する。
getTrace() スタックトレースを取得する。
getTraceAsString() スタックトレースを文字列で取得する。
__toString() 例外の文字列表現

getMessage

例外メッセージを取得する。

<?php
try {
  throw new Exception("error message");
} catch (Exception $e) {
  echo $e->getMessage();
}
?>

getCode

例外コードを取得する。

<?php
try {
  throw new Exception("error message", 10);
} catch (Exception $e) {
  echo $e->getCode();
}
?>

getTrace

stacktraceを取得する。

<?php
function example() {
  throw new Exception;
}
try {
  example();
} catch (Exception $e) {
  var_dump($e->getTrace());
}
?>

getTraceAsString

stacktraceを文字列で取得する。

<?php
function example() {
  throw new Exception;
}
try {
  example();
} catch (Exception $e) {
  echo $e->getTraceAsString();
}
?>

再スロー

キャッチした例外を再スローすることができる。

<?php
try {
  example();
} catch (Exception $e) {
  logException($e);
  throw $e;
}
?>

try catchで全ての例外をキャッチする(バックスラッシュ付きException)

PHPのtry catchでキャッチできるのは、原則として同じネームスペースに属する例外のみである。

PHPのtry catchで全ての例外をキャッチするには、Exceptionの前にバックスラッシュを付ける。

<?php
try {
  example();
} catch (\Exception $e) {
  echo $e->getMessage();
}
?>

これにより、異なるネームスペースに属する例外もキャッチできるようになる。

拡張

PHP組込みのExceptionクラスを拡張することで、ユーザが独自の例外クラスを定義することができる。

<?php
class ExampleException extends Exception {
  # do something
}
?>

ユーザが独自に定義した例外をスローすることができる。

<?php
  throw new ExampleException("error message", 1);
?>