アプリケーション開発において例外処理のテストというのは厄介だと思います。当たり前ですが、例外を発生させなければ例外のテストを行えないからです。

 たとえば、ファイルを書き込む処理でディスク容量が足りていない場合は「System.IO.IOException」が発生します。この例外処理をテストするために何百ギガとあるハードディスクを一杯にするでしょうか。それは現実的ではありませんね。では容量の少ないフロッピーや USB メモリならどうでしょうか。テストをするたびにそれらを用意するのも面倒です。

 意図した場所で意図した例外を思いのままに発生させられたら、例外処理も厄介ではなくなると思います。それをかなえてくれるツールに「DevPartner Fault Simulator」があります。@IT に記事がありましたので紹介します。「例外を思いのままに発生できる「DevPartner Fault Simulator」レビュー」。これは大変便利そうですね。

 ツールの評価もしないでこんな事をいうのも何なのですが、このようなツールのテストで例外処理のテストを十分に行えるのでしょうか。なにを気にしているかというと、本当に例外が発生した場合と、例外をシミュレーションした場合とで動きが変わるのではないかと思っています。

 たとえば .NET Framework 1.1 の環境で、ディスク容量が足りていない場合の例外処理として次のようなコードがあるとします。例外が発生しても Finally 句で Close メソッドを呼んでいるためファイルは確実に閉じられるはずです。

ディスク容量が足りていない場合の例外処理
Dim sw As StreamWriter
Try
    ' ファイルに書き込む処理
Catch ex As IOException
    ' IOException 時の対策
Finally
    sw.Close()
End Try

 このコードには問題があります。Close メソッドを呼び出した時にディスクにデータが書き込まれるため、さらに System.IO.IOException が発生する可能性があります。本当にディスク容量が一杯の時は例外が発生するので、すぐに気づく事ができると思います。

 しかしディスク容量が十分にある場合に、例外をシミュレーションしている状況では Close メソッドが正常に動いてしまうのではないかと思います(確認してなくてごめんなさい)。もしこの現象を知っているのであれば Finally 句でも例外をシミュレートしてやればいいのですが、知らなければテストしても気づかないのではないかと思います。

 例外をシミュレーションできるのは大変すばらしい機能だと思います。しかし、本当に例外が発生した場合と、シミュレーションした場合とで動作が同じである。あらゆる例外をシミュレーションできる。といったようなことが出来なければ、結局は何らかの手段で本当に例外を発生させなければいけません。例外処理のテストは本当に厄介です。

 今回の内容とは関係ありませんが .NET Framework 1.1 には次のバグが潜んでいますのでご注意ください。「[FIX] .NET Framework 1.1 で、十分な空き領域がないディスクのファイルへのアクセスに StreamWriter.Flush () メソッドまたは StreamWriter.Close () メソッドを使用すると、例外エラー メッセージが表示される