【C#】期待しない動作が発生したらプログラムを停止(Debug.Assertの使用法)

C#

アプリケーションの開発中、プログラムが期待とは異なる動作をした場合に、その処理の位置の特定をしたい場合があります。そのような場合にDebug.Assertメソッドが役に立ちます。

本記事では、Debug.Assertメソッドの基本的な使用方法を紹介します。

Debug.Assertの用途

Debug.Assert の主な用途は以下の通りです。

  • プログラムの内部ロジックに関するバグの発見
  • 設定値の誤りの発見

このメソッドは、上記のように、開発者がコードを書く際に、プログラムが正しく動作するための前提条件の検証に使用します。

もし、Debug.Assert実行時に前提条件が満たされない、つまり期待とは異なる状態が発生した場合、プログラムはデバッグモードで中断し、問題が発生した場所と原因についての情報を表示します。

サンプルコード

以下のサンプルコードは、1時間あたりの平均売上を計算するプログラムです。何時間分の平均をとるかはプログラマが決定する内部パラメータとしており、このパラメータが0やマイナスの値などの不正な値に設定されないことをDebug.Assertで監視します(★印)。

using System;
using System.Diagnostics;

class Program
{
    // プログラマが調整する内部パラメータ ★
    static int TotalHours = 0;    // 何時間分の平均をとるか?

    static void Main()
    {
        // ある期間の総売上を取得
        double totalSales = GetTotalSales(TotalHours);

        // Debug.Assertを使用して分母が1以上であることを確認 ★
        Debug.Assert(TotalHours > 0, "売上平均の計算に使用する分母が0以下の値に設定されています。");

        // 1時間あたりの平均売上を計算
        double averageSalesPerHour = totalSales / TotalHours;

        // 計算結果を表示
        Console.WriteLine($"1時間あたりの平均売上: {averageSalesPerHour}");
    }

    // 指定された時間分の総売り上げ
    static double GetTotalSales(int hours)
    {
        return 10000.0; // 仮の総売上を返す
    }
}

実行結果:内部パラメータ TotalHours = 5 とした場合

1時間あたりの平均売上の計算結果を表示します。

1時間あたりの平均売上: 2000

実行結果:誤って内部パラメータ TotalHours = 0 とした場合

Debug.Assertによって、プログラムが動作する前提条件を満たしていないことを検出します。このような場合、Assertに失敗したことを示す旨のメッセージボックスが表示されます。

上記メッセージボックスにおいて、ボタンをクリックした場合の動作は、それぞれ以下通りです。

  • 中止:プログラムの実行を完全に停止します。
  • 再試行:Assertによりプログラムが中断した地点でデバッガに制御を戻します。これにより、問題が発生した原因を調査できます。
  • 無視:Assertによるエラーを無視して計算を続行します。今回のサンプルプログラムでは、Assertを無視した場合の結果表示は、分母を0にして除算するため、以下のようになります。
1時間あたりの平均売上: ∞

注意点

Debug.Assert はプログラム開発中のデバッグ目的で使用する機能であり、ユーザが入力する値の検証に Debug.Assert を使用することは適切ではありません

ユーザ入力の検証を行う場合は、入力値の検証ロジックをif文などの通常の処理として実装します。また、if文によりエラーを検出した場合にはユーザーにメッセージボックス等で通知し、入力値の修正を促す方法を取るべきです。

まとめ

本記事では、Debug.Assertメソッドの基本的な使用方法を紹介しました。Debug.Assert は、開発中のプログラムが動作するための前提条件の検証を自動化できる便利な機能ですのでご活用ください。

タイトルとURLをコピーしました