【 PHP 】PHP8に入門してみた 211日目 PHPの基本 ( オブジェクト指向 例外処理)

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

オブジェクト指向

例外処理

PHPではthrow new Exception('例外が発生しました');のように、Exceptionという例外オブジェクトを生成し例外を発生させることができます。
この例外は、
tryブロック内でキャッチされない限り、スクリプトの実行を停止します。

try {
  // 何らかの処理
} catch (Exception $e) {
  // 例外が発生した場合の処理
  echo '例外が発生しました: ', $e->getMessage(), "\n";
}

例外関連の王様的な存在としてExceptionというクラスがあります。
このクラスでcatchしておけば何でもかんでも補足することができるのです!

 catchブロックはcatchステートメントに定義された例外クラスもしくは例外の基底クラスの場合に補足します。

なんでもかんでもExceptionで補足していいの?

例外処理は、プログラムの安全性を高めるために非常に重要な機能です。
ただし、すべての例外をExceptionクラスでキャッチするのは、適切な例外処理の手法ではないと本書に記述されています。

すべての例外をExceptionクラスでキャッチすることが問題になる理由をいくつか考えてみました。

  • 例外の種類による違い
    すべての例外を同じように扱うことは、例外の種類によって異なる対処が必要な場合に問題が生じます。
    例えば、ファイルを読み込む際に発生するFileNotFoundExceptionは、ファイルが存在しない場合に発生します。
    この場合、ファイルが存在しないためのエラーメッセージを出力するだけで、処理を続行することができます。
    一方で、InvalidArgumentExceptionは、引数が無効である場合に発生します。
    この場合、処理を中断する必要があるかもしれません。
    つまり、異なる例外に対して異なる対処が必要であり、すべてを同じように扱うことはできません。
  • デバッグの困難
    すべての例外を同じように扱うと、どの例外が発生したのかがわかりにくくなります。
    例外を明示的にキャッチすることで、プログラムのデバッグが容易になります。
    例外を明示的にキャッチすることで、発生した例外に応じた適切な処理を行うことができます。
  • 不適切なエラー処理
    すべての例外を同じように扱うことは、エラー処理が不適切になる可能性があります。
    例えば、特定の例外に対して適切なエラーメッセージを出力する場合、すべての例外を同じように扱うと、適切なメッセージが表示されない場合があります。
    これは、ユーザーにとって混乱を招くことがあり、プログラムの信頼性を損なう可能性があります。

状況に応じて適切な例外クラスの選択および例外のコントロールが必要ということですね。

throw式の登場

PHP 8では、throw式が導入されました。これは、式の結果を例外としてスローすることができる機能です。

今まで

function divide($dividend, $divisor) {
  if ($divisor === 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

$result = 0;
try {
  $result = divide(10, 0);
} catch (Exception $e) {
  // エラーメッセージを出力するなどの例外処理を行う
}

PHP8

function divide($dividend, $divisor) {
  return $divisor === 0 ? throw new Exception("Division by zero") : $dividend / $divisor;
}

$result = 0;
try {
  $result = divide(10, 0);
} catch (Exception $e) {
  // エラーメッセージを出力するなどの例外処理を行う
}

 

メモ

例外も奥が深い。

PHPPHP

Posted by raika@blog