[例外処理編]非プログラミングエンジニアが例外処理について学んでみた!前編

  • 2025/3/19
  • Comments Off on [例外処理編]非プログラミングエンジニアが例外処理について学んでみた!前編

これまでに、基本データ構造、配列、条件分岐、ループを学んだび、前回それらをより効率的に利用する為に関数を学びました。

そこで関数を学んだ次のステップとして考慮すべきこととして、プログラムの「もしも」に備える例外処理を学んでいくことにしました。

これまでに学んできたコードで扱っていたデータはすべて正しいものでした。しかし、関数を使い始めて気づくことがあります。それは、「渡されたデータが常に正しいとは限らない」ということです。

例えば、関数に数字を渡すつもりが間違えて文字を渡してしまったらどうなるでしょうか?また、ある計算を行おうとしたときに、0で割るなどして思いがけないエラーが起きたら?プログラムはそこで止まってしまい、思い通りに動かなくなってしまいます。

プログラムが止まる原因を「エラー」と言いますが、このエラーは実際の開発では避けられないものです。だからこそ、プログラミングを学ぶ次のステップとして「エラー処理」を学ぶことは、とても重要な意味を持ちます。

それでは一緒にエラー処理の概念から学んでいきましょう!

エラー処理を学ぶことで、次のようなスキルが身につきます

プログラムが予期せぬデータや状況に出会ったときでも安全に動作する仕組みを作れる。

実際のエラー原因を特定し、修正する力がつく。

ユーザーに優しいプログラムが作れる(突然のエラーでアプリが止まらない)

関数にエラー処理を組み込むことで、予期しない状況でもプログラムを安全に動作させることができます。エラー処理は、入力のミスや例外的な状況に対応するために重要です。

エラー処理の基本概念

入力値のバリデーション

関数に渡された値が正しいかどうかを確認します。

例1: 数字が必要な関数で文字列が渡された場合。

<?php
function divide($a, $b) {
    // 引数の数を確認
    if (func_num_args() !== 2) {
        return "エラー: 関数には2つの引数が必要です。";
    }

    // 入力値が数値かどうかを確認
    if (!is_numeric($a) || !is_numeric($b)) {
        return "エラー: 引数は数値でなければなりません。";
    }

    // 0で割ろうとした場合

    if ($b == 0) {
        return "エラー: 0で割ることはできません。";
    }

    return $a / $b;
}

// テストケース
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つの引数が必要です。
?>

上記のコードでは、3種類のエラー処理をしております

1.PHPの組み込み関数func_num_args()による引数の数をチェック

関数が呼び出された際に、渡された引数の数を取得しています!

この例では、次のコードで、

if (func_num_args() !== 2) {

引数の数が、2つでない場合にエラーメッセージを返しています。

2.PHPの組み込み関数is_numericを用いた引数が数値であるかの確認

if (!is_numeric($a) || !is_numeric($b)) {

数値かどうかを判定するis_numericを!is_numericとし、数値ではない場合は、エラーメッセージを返します。

3.0で割るケースに備える

数学では、「0で割ることはできない」と決まっています。コンピュータでも数学と同じルールに従うので、0で割る計算をするとエラーになります

ゼロ除算が起こると、プログラムが止まったり、計算結果がめちゃくちゃになったりします。

例えば、銀行システムで「手数料を計算する」プログラムが 手数料ゼロのケースを考慮せずに実行 すると…
💥 システムエラー発生! → サービス停止の可能性も😱

if ($b == 0) { return "エラー: 0で割ることはできません。"; }

$b == 0の場合にエラーを返す処理を加えています。

例2:外処理(Exception Handling)

重大な問題が発生した場合にプログラムを停止させずに処理を継続する方法。

<?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();
}
?>

基本的には前回のコード自体に大きな違いはありますが、それぞれのケースで、例外をスローしています。

tryブロックで関数を実行し、例外がスローされた場合はcatchブロックで捕捉し
エラーメッセージを取得し、表示しています。

関数divide($a, $b)を定義

$aを$bで割る処理をする。
エラーチェックを実施

引数が2つ渡されているか確認

if (func_num_args() !== 2) { ... }

→ 2つ以外の引数が渡されたらエラーを投げる。

引数が数値かどうかチェック

if (!is_numeric($a) || !is_numeric($b)) { ... }

→ 文字列などの数値以外が渡されたらエラーを投げる。

0で割ろうとしていないか確認

if ($b == 0) { ... }

→ 0で割るとエラーを投げる。

割り算を実行して結果を返す

return $a / $b;

エラーハンドリング(try-catch)

try {
echo divide(10, 2);
} catch (Exception $e) {
echo "エラーが発生しました: " . $e->getMessage();
}

→ try ブロック内で divide() を実行し、エラーが発生したら catch でキャッチし、エラーメッセージを表示

エラー処理に関しては安全なシステムを作る上でとても重要でもっと深めていきたいと思いますので、今回はここまでとさせて頂きますね~

次回をお楽しみに~~

この情報は役に立ちましたか?


フィードバックをいただき、ありがとうございました!

関連記事

カテゴリー:

未分類

この記事を書いた人:fujisawa

こんにちは!見習いインフラエンジニアの藤澤と申します!
自己紹介はこちら
https://josysnavi.jp/2024/blog-00022

情シス求人

  1. チームメンバーで作字やってみた#1

ページ上部へ戻る