こんにちは、穂苅と申します。
このコラムでは、私が PHP8 技術者認定初級試験のための公式問題集(PHP8 技術者認定初級試験公式問題集)で学習した内容やポイントを取り上げて解説をしていくものです。
P157~162 のChapter 16 例外処理のtry-catch-finally 文を学習してみました。
PHPの例外処理とは?
まず、PHP における例外処理について公式ドキュメントから引用してみます。
PHP は、他のプログラミング言語に似た例外モデルを持っています。 PHP 内で例外がスローされ (throw され)、それが 捕捉され (catch され) ます。発生した例外を 捕捉するには、コードを try ブロックで囲みます。 各 try ブロックには、対応するcatch ブロックあるいは finally ブロックが存在する必要があります。
(参考:https://www.php.net/manual/ja/language.exceptions.php )
これだと少し前提知識が必要でしたので、もう2 段階ほど簡単なところから理解してみました。そもそも例外処理というは、プログラムの実行をしている中でのエラーに対して行う処理のことで、例えばその場合に、 処理をやり直す、 エラー内容をログに記録、 エラーの発生を通知、などの対応を取るために①②③使用します。これによって、プログラム自体が「正常に動作した」という状況にすることが出来ます。
例外処理の考え方としては、PHP の公式ドキュメントにもありますが以下の流れで進みます。
1. 例外(エラー)が発生した場合にそれを知らせる = throw(投げる)
throw new 例外クラス名 (“メッセージ”);
2. 投げられた例外を受け取り、実行したい処理を書く = try ~ catch ~ finally(受け取る 処理)→
try {
// 処理
} catch (Exeption $e) {
// 投げられた例外にどのように反応するかを定義
} finally {
// 例外が起きても起きなくても必ず実行される処理
Try-catch文は複雑?処理の順序が大事
次は公式問題集にあった問題をベースに考えてみます。以下のケースの場合、try-catch 文の中のどこの処理(1)〜(3)を通るか、という問題です。
<?php
class NameException extends RuntimeException { }
class StockException extends RuntimeException{ }
class Zaiko {
public function __construct(public string $name, public int $stock) {
if (strlen ($name) === 0) {
throw new NameException(‘在庫の名前を入力してください。’);
}
if ($stock < 0) {
throw new StockException(‘在庫数は0 以上を入力してください。’);
}
}
}
try {
$pen = new Zaiko(”, -1);
} catch (RuntimeException $e) {
// (1)
} catch (NameException $e) {
// (2)
} catch (StockException $e) {
// (3)
}
?>
皆さんは分かりますでしょうか。
ポイントとしては以下です。
1. 例外throw された時点で1つ上の処理(関数の呼び出し元)に戻る
2. catch は子の例外もcatch する
ですので、まずは、throw new NameException(‘在庫の名前を入力してください。’); の例外処理が飛びます。その後、try-catch の最初(catch (RuntimeException $e) { })で NameException をcatch しようとします。
$pen = new Zaiko(”, -1); でZaiko インスタンスを作る際にNameException の例外が発生し、catch(RuntimeException $e) { } にてcatch され、最初にマッチしたcatch として(1 )を通るというのが
答えです。
最初は複雑なところもあるため、こちらのサイトのように図で理解してみるのがいいと思いました。https://cslab.in/exception-handling-in-php-understanding-trycatch-and-finally/
PHP8技術者認定初級試験で、正しいPHPの理解を
今回は、例外処理について勉強してきました。例外処理というのは、あまり意識したことは無かったのですが、確かにプログラムを作っていくうえでは欠かせない処理だと感じました。どの処理を通るのか、想定通りの動きになるのか、想定のヌケモレは無いのかなどいくつも考えるべき部分がありますが、まずは基本を抑えてから徐々に様々なパターンに触れていきたいです。
次回以降もPHP で学習した内容をシェアしていきますので、よろしくお願いいたします。
また、PHP の学習やエンジニアになるためのマイルストーンとして、PHP 試験はおすすめです。PHP8技術者認定初級試験はPHP を扱うあらゆる方にとって有益な試験になるはずですので、ご興味がある方はぜひチャレンジしてみてください。
試験ページ: PHP8 初級試験