デバッグ用メッセージと出力ウィンドウ

今回のサンプルではデータが数件しかなかったので、ループの中にブレークポイントを設定してバグを発見できました。しかしループの回数が多い場合には、デバッグ用のメッセージを出力することを検討してみても良いでしょう。

デバッグ用のメッセージを出力するには、System.Diagnostics.Debug.WriteLineメソッドを使用します。クラスの最初の部分で「using System.Diagnostics;(VBの場合はimport ~)」と名前空間を記述していれば「Debug.WriteLine(~);」と書くだけでかまいません。

出力ウィンドウにデバッグメッセージが出力されている

ここでは「Debug.WriteLine(string.Format("合計は{0}円です" , sum.ToString()));」と記述して、プログラムを実行しました。デバッグ用のメッセージは出力ウィンドウに表示されます。出力ウィンドウには[出力元の表示]という名前のドロップダウンリストがありますので、そこで「デバッグ」が選択されていることを確認しておいてください。 なお、このDebugクラスの命令は、開発中のDebugビルド時にのみ有効なため、本番リリース用のReleaseビルドでは表示されません。そのためアプリケーションの納品前にこれらのデバッグメッセージを削除しなくても問題はありません。

プログラムの動作確認

以上、「ステップ実行」「ビジュアライザ」「ウォッチウィンドウ」といったデバッグ機能を活用して、2つのバグ(抽出ミスと合計ミス)の原因を見つけることができました。

正しく修正されたアプリケーション

これまでの修正により、プログラムが正しく動作することも確認できました。

例外処理アシスタント

サンプルプログラムの修正は完了しましたが、開発中に発生しうる「例外」についても紹介しておきます。例外は、プログラム実行中に何らかの問題が生じると発生します。以下の例では、対象テーブルが存在しないSQLを実行したために例外が発生しています。

SQLの間違いが原因で例外が発生した画面(商品と賞品のテーブル名間違い)

例外の発生をプログラムで制御できていない場合には、上図のように、例外の発生箇所にカーソルがあたり、プログラムの実行が中断されます。その際、出力ウィンドウにエラーメッセージが表示されます。ただ出力ウィンドウはテキストベースでわかりにくいため、通常は「例外処理アシスタント(例外ヘルパーとも呼びます)」を使って例外の原因を把握します。例外処理アシスタントは、例外が発生すると自動的に表示されます。もし表示されていない場合には、エラー発生箇所にカーソルをもっていくと赤いエクスクラメーションマークが現れるので、それをクリックします。

例外処理アシスタントがポップアップ表示される

このウィンドウには、エラーの概要に加え、トラブルシューティングのヒント等が表示されます。エラーの詳細を知りたい場合には[詳細の表示...]をクリックします。

例外の[詳細の表示]ウィンドウ

MessageプロパティやStackTraceプロパティを見れば、例外が発生した詳細の理由を確認できます。

例外ウィンドウ

先ほど「例外を制御できない場合にはプログラムが停止する」と説明しましたが、例えば、GetAllBooksメソッドが次のように「try~catch」ステートメントで囲まれていたとします。

try~catchを記述して例外を制御しているコード

このコードで先ほどの例外が発生すると、catch句でその例外が受け取られ、エラーが発生したことを示すメッセージボックスが表示されます。つまり、例外は発生しますが制御できているのでプログラムは停止しません。 ただ、デバッグをしていると、このようなコードにおいても、どこで例外が発生したのかを把握しなければならないこともあります。この場合には、[デバッグ]メニューの[例外]をクリックして「例外ウィンドウ」を開きます。

例外ウィンドウの設定

この例外ウィンドウでは、例外が発生(スローといいます)した時に一時停止させたい例外を選択できます。通常は[Common Language Runtime Exceptions]の[スローされるとき]にチェックを入れておけば、例外が発生した時にプログラムが一時停止し、例外処理アシスタントが表示されるようになります。問題が解決すれば、再び例外ウィンドウを開いて元の設定に戻しておくと良いでしょう。 なお「try~catch」ステートメントの書き方は、開発しているソフトウェアやプロジェクトの指針にあわせて記述するようにしてください。