CodeIgniter 4で例外(Exception)を使いこなす!初心者向けエラーハンドリング徹底解説
生徒
「プログラムを作っていると、たまに真っ白な画面になったり、英語のメッセージが出て止まっちゃうんです。これってどうすればいいですか?」
先生
「それはプログラムが『どうしていいかわからない!』とパニックになっている状態ですね。CodeIgniterには、そういった予期せぬトラブルを優しく処理する『例外処理』という仕組みがあるんですよ。」
生徒
「パニックをなだめる方法があるんですね!具体的にどうやって書くのか知りたいです。」
先生
「では、エラーが起きても慌てないための『例外(Exception)』の使い方を基本から丁寧に学んでいきましょう!」
1. 例外処理(Exception)とは?エラーとの違いを解説
プログラミングの世界では、避けて通れないのが「エラー」です。しかし、エラーには大きく分けて2つの種類があります。1つは、書き間違いなどで最初から動かないもの。もう1つは、動いている途中で予想外のことが起きて止まってしまうものです。この後者をスマートに扱う技術を例外処理(Exception Handling)と呼びます。
「例外」とは、文字通り「例外的(イレギュラー)な事態」のことです。例えば、料理のレシピ(プログラム)に従ってカレーを作っているときに、「ジャガイモを切る」という工程で包丁が折れてしまったとしましょう。これがプログラミングにおける「例外」です。包丁が折れたまま無理やり料理を続けようとすると大怪我をしますよね?そこで、「もし包丁が折れたら、スペアの包丁を使うか、ハサミで代用する」といった具合に、あらかじめトラブルが起きたときの行動を決めておくのが例外処理の役割です。
2. CodeIgniter 4で必須の「try-catch」構文の基本
CodeIgniterを含むPHPのプログラムで例外を捕まえるためには、try(トライ)とcatch(キャッチ)という合言葉を使います。この構文は、初心者が一番最初に覚えるべき魔法の言葉です。
- tryブロック:「とりあえずこれをやってみて!」という実行したい処理を書く場所です。
- catchブロック:「もしtryの中でトラブル(例外)が起きたら、ここに来て!」というレスキュー隊のような場所です。
これを使うことで、エラーが発生してもシステムがいきなり終了して画面が真っ白になるのを防ぎ、ユーザーに「ただいまメンテナンス中です」といった優しいメッセージを表示させることが可能になります。
try {
// ここでエラーが起きそうな処理を試す
$number = 0;
if ($number === 0) {
// 自らエラーを発生させる(投げる)
throw new \Exception("0で割り算はできません!");
}
echo 10 / $number;
} catch (\Exception $e) {
// エラーが起きたらここが実行される
echo "トラブル発生: " . $e->getMessage();
}
実行結果は以下のようになります。
トラブル発生: 0で割り算はできません!
3. 自らエラーを報告する「throw」の使い方
先ほどのコードに出てきたthrow(スロウ)という言葉について詳しく説明します。これは、プログラムの中で「あ、これはおかしいぞ!」と判断したときに、自ら例外を投げ上げる動作です。野球のピッチャーがボールを投げるイメージですね。投げられたボール(例外)は、誰かがキャッチ(catch)しない限り、プログラムを停止させてしまいます。
例えば、ユーザーが入力した年齢がマイナスだった場合、それは論理的にありえないですよね。そんな時に「throw new \Exception("年齢がマイナスです");」と書くことで、プログラムに異常を知らせることができます。CodeIgniterの開発では、データベースに保存する前や、計算を行う前にこのチェックを入れるのが一般的です。
4. CodeIgniter独自の便利な例外クラスを使ってみよう
CodeIgniter 4には、標準のPHPよりもさらに便利な「専用の例外」が用意されています。特によく使うのがPageNotFoundExceptionです。これは、ユーザーが存在しないページにアクセスしたときに「404エラー(ページが見つかりません)」という専用の画面を表示するためのものです。
初心者のうちは、「どこでエラーを出すべきか」に迷うことが多いですが、CodeIgniterが用意してくれているものを使うことで、フレームワークのルールに沿った綺麗なプログラムを書くことができます。これを使うと、自動的に設定されたエラー画面へ誘導してくれるので、自分で難しい処理を書く手間が省けます。
// CodeIgniter専用のページが見つからない例外を使う例
use CodeIgniter\Exceptions\PageNotFoundException;
public function showArticle($id = null)
{
if ($id === null) {
// 記事が見つからない場合に404エラーを投げる
throw PageNotFoundException::forPageNotFound("指定された記事はありません。");
}
echo "記事番号 " . $id . " を表示します。";
}
5. データの型をチェックする厳格なエラーハンドリング
プログラミング未経験の方にとって難しいのが「データ型」という概念です。パソコンは「数字の1」と「文字の1」を別物として扱います。もし、計算をしたいのに「文字」が送られてきたら、プログラムは困ってしまいます。そこで、例外処理を使ってデータの種類を厳しくチェックする方法を学びましょう。
InvalidArgumentException(不適切な引数の例外)という言葉を使います。「引数(ひきすう)」とは、プログラムに渡すデータの入れ物のことです。ここに間違った種類のデータが入ってきたときに、「それはルール違反ですよ!」と教えてあげるための仕組みです。これにより、バグ(プログラムの不具合)を未然に防ぐことができます。
public function checkScore($score)
{
try {
if (!is_numeric($score)) {
// 数字ではないものが来たら例外を投げる
throw new \InvalidArgumentException("点数は数字で入力してください。");
}
echo "あなたの点数は " . $score . " 点です。";
} catch (\InvalidArgumentException $e) {
// 間違ったデータが来た時の対応
echo "エラー通知: " . $e->getMessage();
}
}
もし「あいうえお」という文字を渡した場合の実行結果です。
エラー通知: 点数は数字で入力してください。
6. ファイルの読み込み失敗を優しくキャッチする
Webアプリケーションを作っていると、画像ファイルや設定ファイルを読み込む場面がたくさんあります。しかし、指定した場所にファイルがなかったり、壊れていたりすることも考えられます。そんな時、何も対策をしていないとWebサイト全体が壊れて動かなくなってしまいます。
これを防ぐために、ファイルの読み込み処理をtryで囲みます。もし読み込みに失敗しても、catchブロックの中で「標準の画像を表示する」といった代替案(バックアッププラン)を用意しておくことができます。これが、プロのエンジニアが書く「壊れにくいプログラム」の第一歩です。
public function loadConfig($fileName)
{
try {
if (!file_exists($fileName)) {
throw new \RuntimeException("設定ファイル [" . $fileName . "] が見つかりません。");
}
// ファイルを読み込む処理(ここでは省略)
echo "設定を読み込みました。";
} catch (\RuntimeException $e) {
// ファイルがなくても、デフォルト設定で動かし続ける
echo "警告: " . $e->getMessage() . " 規定の設定で起動します。";
}
}
7. ログ(記録)を残す重要性:エラーを宝に変える
例外をcatchしたあと、ただメッセージを表示するだけでなく、何が起きたのかを「記録」しておくことが非常に大切です。この記録のことをログ(Log)と言います。CodeIgniterには、log_message()という便利な命令があります。
たとえエラーが起きたとしても、その原因がログに残っていれば、後からプログラミングを修正して改善することができます。パソコンを触ったことがない方でも、日記をつけるのと同じだと思ってください。「何時に、どこで、どんなトラブルが起きたか」をシステムに日記として書かせるのです。これにより、ユーザーが困っていることにいち早く気づき、サービスをより良くしていくことができます。
8. 開発モードと本番モードでのエラー表示の違い
CodeIgniter 4には、開発者にとって非常に親切な機能があります。それは、プログラムを書いている最中(開発モード)は、エラーの内容を詳細に画面に出してくれる機能です。どこが間違っているのか一目でわかるので、初心者でも安心です。
しかし、実際に世界中の人に見てもらう状態(本番モード)では、詳細なエラー内容は隠す必要があります。なぜなら、中身が詳しく見えすぎると、悪い人に攻撃されるヒントを与えてしまうからです。CodeIgniterは設定一つで、開発時は「詳細なレポート」、公開時は「シンプルなエラー画面」へと自動で切り替えてくれます。この「環境の切り替え」を意識することも、例外処理を学ぶ上での重要なポイントです。