初心者のためのC#プログラミング本格入門107 - 例外の報告をキャッチしよう
エラーを通知することを「例外をスローする」といいます。throwキーワードを使用しているから分かりやすいかと思います。スローされた例外を受け取るにはどうしたらいいのでしょうか?やはり、専用の構文を使用します。
class SimpleListTest : Test
{
//元となるオブジェクト空要素を削除した時の、
//Enumeratorオブジェクトの挙動をチェック。
private void EnumeratorWhenRemoveElement()
{
base.Execute( );
//任意の要素を準備
int count = 10;
for ( int i = 0 ; i < count ; i++ ) {
this.target.Add( i );
}
//Enumerator取得後1要素を1つ消す
this.ie = this.target.GetEnumerator( );
this.target.Remove( );
count = this.target.Count;
//Enumeratorの個数をチェック
int ieCount = 0;
//例外がスローされるかもしれない処理をトライ(試みる)
try
{
while ( ie.MoveNext( ) == true ) ++ieCount;
} catch ( System.InvalidOperationException e )
{
//例外をキャッチ♪
System.Console.WriteLine( "例外スローされました。" );
System.Console.WriteLine( e.ToString( ) );
}
if ( count != ieCount ){
string message =
"Enumeratorと元のオブジェクトの要素数が一致してません。";
base.Error( message );
}
}
}
文法はちょっと難しく見えるかもしれません。でも、やっていることは単純なので大丈夫です。tryキーワードで試して、catchキーワードで受け取ります。初心者の方は{}でプログラムがくくられているのが気になると思います。この理由は、{}はプログラムを塊で扱うからです。if文やwhile文でも{}を使っているから、それを思い返すと納得できると思います。
さて、このサンプルを実行すると例外がスローされます。しかも、「System.InvalidOperationExceptionはハンドルされませんでした」などといったよくわからないダイアログ(画面)まで表示されます。慣れないとビックリするかもしれませんが、気にする必要はありません。「詳細を表示」という場所をクリックしてから、表示されている三角をクックして詳細な情報を見てください。その中に、StackTraceという項目がありますので、そこをよく読んでください。すると、どういった順序でプログラムが実行されたのかわかります。
この問題を解決するには、プログラムの実行順序をもとに内容を理解します。答えを提示します。
class SimpleListTest : Test
{
//foreachを模倣する
public void ForeEachTest()
{
//準備
base.Execute();
for ( int i = 0 ; i < 10 ; ++i )
{
this.target.Add( i );
}
//これを追加
this.ie = this.target.GetEnumerator( );
//1 ~ 9 の数値が格納されているはず
int x = 0;
System.Text.StringBuilder error =
new System.Text.StringBuilder();
ie.Reset();
do {
if ( ie.Current != x )
{
string message =
"ForeEachTestで予期せぬ値が返されました。" +
"予想値:" + x +
" 返された値" + ie.Current +
System.Environment.NewLine;
error.Append( message );
base.Error( message );
}
++x;
} while ( ie.MoveNext() );
if ( error.Length != 0 ) {
base.Error( error.ToString() );
}
}
}
この件で分かったと思いますが、多くのエラーの解決法自体は簡単です。例外処理の便利さがわかってもらえると思います。初心者の方はまだ慣れないと思いますが、何度も使いますので安心してください。使っているうちに覚えます。