Developer

【PHP応用】例外処理
2021.07.31
Lv2

【PHP応用】例外処理

例外処理②

前回は例外処理の基本文法を学びましたが、今回は例外処理の意義や具体的な使用法について紹介します。

■例外処理のメリット

例外が発生した際の処理を記述するtry-catch文ですが、以下のようなメリットがあります。

  1. 例外が発生する可能性のあるコードをtryブロックでまとめられるため、逐一チェックする必要性がなくなる
  2. try-catch文は例外処理で使われるものであるため、正常処理と異常処理を分けて記述することができ可読性が上がる
  3. メソッドの戻り値を正常処理の結果としてのみ使用でき、異常処理の結果を戻り値として使用せずに済む

try-catchを使用せずに if文で正常・異常の分岐をして処理することも可能なものも存在しますが、
上記のような理由でtry-catchを使用して例外処理を行うことが一般的です。

■例外の種類

まずは例外というものがどのような種類があるのか以下の例を確認してみましょう。
以前は Error(エラー) と Exception(例外) は別物として扱われていましたが、
PHP 7 からは、以下のように Throwable を最上位として Error と Exception に分類されるようになりました。

Throwable

  ├ Error すべての内部エラーの基底クラス
  │   │
  │   ├ ArithmeticError
  │   │    └ DivisionByZeroError
  │   ├ AssertionError
  │   ├ ParseError
  │   └ TypeError

  └ Exception すべての例外の基底クラス

      ├ ErrorException

      ├ RuntimeException
      │    ├ OutOfBoundsException
      │    ├ OverflowException
      │    ├ RangeException
      │    ├ UnderflowException
      │    ├ UnexpectedValueException
      │    └ PDOException

      └ LogicException
             ├ BadFunctionCallException
             │     └ BadMethodCallException
             ├ DomainException
             ├ InvalidArgumentException
             ├ LengthException
             └ OutOfRangeException

■例外処理サンプル

それでは実際に例外処理を行っているサンプルを確認してみましょう。

●例外処理サンプル その1

まずはシンプルな例外処理です。

echo "<h1>例外処理サンプル その1</h1> ";

// 引数が負の値の場合、RuntimeExceptionが発生する関数
function sample($x) {
	try {
		echo "引数 : $x <br>";
		if($x < 0){
			throw new RuntimeException("例外発生<br>");
		} else {
			echo "正常処理<br>";
		}
	} catch (RuntimeException $e) {
		echo $e->getMessage();
	}
}
// 正常処理の場合
sample(10);

// 異常処理の場合
sample(-10);

●例外処理サンプル その2

次に複数のcatchがある例外処理です。
複数のcatchを使用する際に、継承関係にある例外クラスを使用する場合
サブクラスを上から順に書く必要があります。(親クラスですべてキャッチしてしまうため)
今回の場合RuntimeExceptionの子クラスとしてOutOfBoundsExceptionクラスが定義されているため
catchはOutOfBoundsExceptionから行います。

<?php

echo "<h2>例外処理サンプル その2</h2> ";

// 引数によって発生する例外が異なる関数
// 負の値:RuntimeException
// 0:OutOfBoundsException
// 正の値:正常処理
function sample($x) {
	try {
		echo "引数 : $x <br>";
		if($x < 0){
			throw new RuntimeException("RuntimeException発生<br>");
		} else if($x == 0) {
			throw new OutOfBoundsException("OutOfBoundsException発生<br>");
		} else {
			echo "正常処理<br>";
		}
	} catch (OutOfBoundsException $e) {
		echo $e->getMessage();
	} catch (RuntimeException $e) {
		echo $e->getMessage();
	}
}
// 正常処理の場合
sample(10);

// OutOfBoundsExceptionの場合
sample(0);

// RuntimeExceptionの場合
sample(-10);

?>

●例外処理サンプル その3

次にcatchする対象がExceptionだけでなくErrorも追加された例外処理です。
これまでtry-catch文では Exception 以下のクラスのみcatchできましたが、
PHP 7 からErrorクラスをcatchすることも可能になりました。

echo "<h2>例外処理サンプル その3</h2> ";

// 引数によって発生する例外が異なる関数
// 負の値:Exception
// 0:Error
// 正の値:正常処理
function sample($x) {
	try {
		echo "引数 : $x <br>";
		if($x < 0){
			throw new Exception("Exception発生<br>");
		} else if($x == 0) {
			throw new Error("Error発生<br>");
		} else {
			echo "正常処理<br>";
		}
	} catch (Exception $e) {
		echo $e->getMessage();
	} catch (Error $e) {
		echo $e->getMessage();
	}
}
// 正常処理の場合
sample(10);

// Exceptionの場合
sample(-10);

// Errorの場合
sample(0);

上記で紹介したサンプルのように
例外処理を行うことができます。

今回の例外処理の紹介は以上です。
次回の記事では独自の例外クラスを作成し、
例外処理を行う方法を紹介します。

PHPWEBプログラミング講座 連載目次リンク

PHPWEBプログラミング講座 連載目次