.NET Tools
例外を思いのままに発生できる
株式会社ピーデー 川俣 晶 |
|
|
.NET Frameworkフォールトを試す
Fault Simulatorが扱える異常ケースは、環境フォールトのほかに.NET Frameworkフォールトがある。.NET Frameworkフォールトは、.NET Frameworkクラス・ライブラリのクラスや例外と直接対応するもので、よりきめ細かく対象を指定できる。
例えば、ある特定のメソッドやプロパティを実行したときに例外が発生するように指定することができる。WriteLineメソッド実行時に限ってIOException例外を発生させたいと思うなら、Fault Simulatorウィンドウ上部に並んでいるボタンのうち、左から2番目の[.NET Frameworkフォールトの追加]ボタンをクリックする。すると、追加する.NET Frameworkフォールトの内容を指定するダイアログが表示される。
追加する.NET Frameworkフォールトの内容を指定するダイアログ |
Fault Simulatorウィンドウから[.NET Frameworkフォールトの追加]ボタンをクリックして開く。 |
ここでも環境フォールトと同様にステップ順に指定を行う。ステップ1は名前空間、ステップ2にはメソッドなどを指定する(注:StreamWriterクラスはTextWriterクラスを継承しており、WriteLineメソッドはTextWriterクラスのメソッドなので、ここではTextWriter.WriteLineを選択している)。ステップ3は条件となる引数を指定できるがオプションなのでここではそのままにしておく。ステップ4では、そのメソッドが発生し得る例外がリストされているので、希望する例外を選択する。ステップ5〜6もオプションなのでそのままにしておく。
これだけ指定すれば、あとは環境フォールトの場合と同様にシミュレーションを実行できるのだが、実は.NET Framework例外に関しては、もっと楽で強力な指定方法が存在する。
ソース・コードを入力後、一度ビルドを行ったコード・ウィンドウをよく見てみよう。ビルド・エラーが存在しないにもかかわらず、黒い波線が付いた個所が存在することが読み取れると思う。
黒い波線が付いた個所が存在するコード・ウィンドウ |
黒い波線の行はFault Simulatorがシミュレーションできる.NET Frameworkフォールトが存在することを示している。その行を右クリックしてコンテキスト・メニューを出し[.NET Frameworkフォールトの追加]を選ぶことにより、その位置で例外を発生させるように設定できる。 |
この黒い波線の付いた部分にマウスカーソルを乗せると、その部分にはFault Simulatorがシミュレーションできる.NET Frameworkフォールトが存在することと、その具体的な種類が表示される。そこで、その個所を右クリックしてコンテキスト・メニューを出し、[.NET Frameworkフォールトの追加]を選ぶ。すると以下のようなダイアログが表示される。
黒い波線の行から開く[.NET Frameworkフォールトの追加]ダイアログ |
特定の個所のメソッド呼び出しに対して例外を発生させることができる。このダイアログで、対象となる行で発生させたい例外を選択するだけでシミュレーションの設定は完了する。 |
ここで注目すべき点は、2つある。1つは、この指定がソース・コード上の特定の個所にのみ結び付けられている点である。同じメソッドの呼び出しがソース・コード中に複数存在していても、このメソッド呼び出しでのみシミュレーションは発動する。それ故に、より効率的なテストが行える(逆に、ソース・コード上のあらゆる個所で特定のメソッド呼び出しに対してシミュレーションを行いたいなら、上述した[.NET Frameworkフォールトの追加]ボタンを使う)。
もう1つは、名前空間やメソッドをいちいちリストから選ぶ手間から解放されたことである。それどころか、WriteLineメソッドは継承したクラスのメソッドなので、クラス名を読み替える……といった配慮も必要ない。それは自動的に判定されて、正しくTextWriter.WriteLineというメソッド名が認識されているのである。
つまり、コンテキスト・メニューから[.NET Frameworkフォールトの追加]を選んで、ステップ3の例外の種類を選んだ後に[OK]ボタンをクリックするだけで、シミュレーションの設定が完了してしまったということである。
このままFault Simulatorウィンドウにある[Fault Simulatorを開始]ボタンをクリックすると、以下のように指定したメソッドで、指定した例外が発生したことが分かる。
特定の行に.NET Frameworkフォールトを設定した場合の実行結果 |
ここではシミュレーションの設定として、writer.WriteLine(……)の行でIOException例外を発生させるようにしている。このためプログラムはその行で実行が停止し、デバッグ状態となる。 |
さて、ここで環境フォールトの場合に表示される例外ダイアログと、この画面の例外ダイアログを比較してみよう。
どちらも同じIOException例外を発生させているのだが、表示されているメッセージが異なっている。環境フォールトの場合は、「ディスクに十分な空き容量がありません。」と出ているが、.NET Frameworkフォールトの場合は、「I/O エラーが発生しました。」である。
この差は、重要な意味を持つので注意を払う必要がある。環境フォールトは、環境レベルの異常ケースをシミュレーションするため、.NET Frameworkクラス・ライブラリは異常ケースの発生原因を認識して処理を行っている。そのため、異常ケースの原因に言及したメッセージを埋め込むことができる。
しかし、.NET Frameworkフォールトの場合は、.NET Frameworkクラス・ライブラリをバイパスするような形で例外発生をシミュレーションしているに過ぎず、発生原因を識別するような情報は持っていないというわけだ。
複雑な条件を付けての例外発生
例外を発生させるタイミングには、よりきめ細かく条件を付けることができる。例えば、上記の例で、WriteLineメソッドを実行すると必ず例外を投げるのではなく、3回は正常に実行した後、4回目に例外を発生させるにはどうしたらよいのだろうか。そのためには例外発生の条件指定を行うことができる。
条件はフォールトの追加でも行うことができるが、すでに設定したフォールトに指定することもできる。Fault Simulatorウィンドウのリストに表示された項目を右クリックし、[フォールトを修正]を選んでみよう。すると、以下のようなダイアログが表示され、引数や条件を修正することが可能となる。
[フォールトの修正]ダイアログ |
Fault Simulatorウィンドウのリストに表示された項目を右クリックし、[フォールトを修正]を選ぶ。ここでは設定済みのフォールトに対して、例外を発生させる場合のメソッドの引数や条件を指定できる。 |
ここで、条件の項目を「条件なし」から「スキップ数」に変更し、横にスキップする回数として「3」を設定してみよう。
このまま[Fault Simulatorを開始]ボタンをクリックして実行すると、WriteLineメソッド呼び出して実行は停止する。停止したときのカウンタ変数iの値を調べると、3という数値になっている。
例外発生時に変数iの値を表示させたクイック・ウォッチ |
フォールトの発生条件でスキップ数を「3」に設定しているため、iの値が0、1、2の間は、例外は発生しない。 |
つまり、変数iの値が0、1、2と3回正常に実行が続いた後、3になって例外が発生したというわけである。
INDEX | ||
[.NET Tools] | ||
例外を思いのままに発生できる「DevPartner Fault Simulator」レビュー | ||
1.異常ケース再現シミュレータ「DevPartner Fault Simulator」 | ||
2.簡単なシミュレーション操作(環境フォールト) | ||
3..NET Frameworkフォールトを試す | ||
4.スタンドアロン実行とコマンドラインからのテスト | ||
「.NET Tools」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|