[例外処理編]非プログラミングエンジニアが例外処理について学んでみた!後編
- 2025/6/13
- ブログ
- Comments Off on [例外処理編]非プログラミングエンジニアが例外処理について学んでみた!後編
これまでに、基本データ構造、配列、条件分岐、ループを学んだび、それらをより効率的に利用する為に関数を学びました。
もしもに備えるエラー処理
そこで関数を学んだ次のステップとして考慮すべきこととして、プログラムの「もしも」に備える例外処理を学んでいくことにしました。
これまでに学んできたコードで扱っていたデータはすべて正しいものでした。しかし、関数を使い始めて気づくことがあります。それは、「渡されたデータが常に正しいとは限らない」ということです。
例えば、関数に数字を渡すつもりが間違えて文字を渡してしまったらどうなるでしょうか?また、ある計算を行おうとしたときに、0で割るなどして思いがけないエラーが起きたら?プログラムはそこで止まってしまい、思い通りに動かなくなってしまいます。
そこで前回は、重大な問題が発生した場合にプログラムを停止させずに処理を継続する方法として例外処理を学びました。
簡単におさらいをすると、
<?php
function divide($a, $b) {
// 引数の数を確認
if (func_num_args() !== 2) {
throw new Exception("エラー: 関数には2つの引数が必要です。");
}
// 入力値が数値かどうかを確認
if (!is_numeric($a) || !is_numeric($b)) {
throw new Exception("エラー: 引数は数値でなければなりません。");
}
// 0で割ろうとした場合
if ($b == 0) {
throw new Exception("エラー: 0で割ることはできません。");
}
return $a / $b;
}
try {
// テストケース
echo divide(10, 2); // 正常: 5
echo "\n";
echo divide(10, 0); // エラー: 0で割ることはできません。
echo "\n";
echo divide(10, "abc"); // エラー: 引数は数値でなければなりません。
echo "\n";
echo divide(10); // エラー: 関数には2つの引数が必要です。
echo "\n";
echo divide(10, 5, 3); // エラー: 関数には2つの引数が必要です。
} catch (Exception $e) {
echo "エラーが発生しました: " . $e->getMessage();
}
?>
上記のコードを解説してみますと、PHPの組み込み関数func_num_args()で引数の数をチェックし
渡された引数の数が2つでない場合に例外をスローしています。
加えて、入力値のバリデーションとしまして、
渡された値が数値かどうか判定するPHPの組み込み関数is_numericを利用し、すべての引数が数値であるかどうかをチェックしています。そして数値でない場合には例外をスローしております。
0で割るケースの処理として、
$b == 0の場合、throw new Exceptionでエラーをスローしております。
他にも例外処理の活用として
それぞれのケースで、例外をスローしています。
tryブロックで関数を実行し、例外がスローされた場合はcatchブロックで捕捉し
エラーメッセージを取得し、表示しています。
それでは次のステップとして「エラーメッセージの返却」について見ていきましょう!
関数がエラーを検知したときに、ユーザーにはシンプルなメッセージを返しつつ、詳細なエラー情報をログファイルに記録する方法を紹介します。
<?php
function divide() {
// 関数名と現在時刻を取得(ログ用)
$functionName = __FUNCTION__;
$timestamp = date('Y-m-d H:i:s');
// 引数の数を確認
$numArgs = func_num_args();
if ($numArgs !== 2) {
$message = "[$timestamp] [ERROR] $functionName: 引数の数が不正です($numArgs個)";
error_log($message);
return "エラー: 引数は2つ必要です。";
}
// 引数を取得
$args = func_get_args();
$a = $args[0];
$b = $args[1];
// 数値チェック
if (!is_numeric($a) || !is_numeric($b)) {
$message = "[$timestamp] [ERROR] $functionName: 数値でない引数が渡されました。a=$a, b=$b";
error_log($message);
return "エラー: 数値以外が渡されました。";
}
// ゼロ除算チェック
if ($b == 0) {
$message = "[$timestamp] [ERROR] $functionName: 0による除算エラー。a=$a, b=$b";
error_log($message);
return "エラー: 0で割ることはできません。";
}
// 正常な場合は計算結果を返す
return $a / $b;
}
// --- テスト呼び出し ---
echo divide(10, 0) . "\n"; // 0で割る → エラー
echo divide(10) . "\n"; // 引数が1つ → エラー
echo divide(10, 5, 2) . "\n"; // 引数が3つ → エラー
echo divide(10, "abc") . "\n"; // 数値でない → エラー
echo divide(20, 5) . "\n"; // 正常 → 4
?>
error_log() の活用
このコードでは error_log() を使って、エラーの詳細をログファイルに記録しています。
これにより、ユーザーにはエラー詳細を見せずに、開発者だけが問題を追跡できます。
ログに含める情報
実行日時
関数名(__FUNCTION__ を使用)
入力値(a, b)
エラー内容
返却するエラーメッセージ
例として今回のコードを0で割るという行為を行なった場合、
error_logファイルには、
[2025-06-06 15:10:45] [ERROR] divide: 0による除算エラー。a=10, b=0
のような表示が入ります!
またユーザー向けには「エラー: 0で割ることはできません。」のように、簡潔かつ理解しやすい文言にしています。
まとめ:エラー処理は「プログラムのやさしさ」
プログラムを書いていると、想定外の入力や思わぬトラブルに必ず出会います。
そんなとき、エラー処理がきちんとできていれば、ユーザーにやさしいメッセージを返したり、問題の原因をすぐに見つけたりすることができます。
特に初心者のうちは、「例外処理は難しい」「returnで返せばいいかな?」と感じるかもしれません。
しかし、小さなチェックでも積み重ねることで、壊れにくく・信頼されるコードに近づいていきます。
簡単な条件分岐や try-catch、error_log() の活用だけでも、十分立派なエラー処理です。
まずは今回のような「割り算のチェック」から始めて、エラーに強いコードを書けるようになっていきましょう!
この情報は役に立ちましたか?
カテゴリー: