例外クラスのインスタンスを活用する
いうまでもなく、例外クラスのインスタンスは、インスタンスなので、メソッドやプロパティを持つ。Exceptionクラスには有益な情報を得られるメソッドやプロパティがあるので、それを使ってみよう。
1: using System;
2:
3: namespace ConsoleApplication45
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: try
10: {
11: throw new Exception("Sample");
12: }
13: catch( Exception e )
14: {
15: Console.WriteLine(e.Message);
16: Console.WriteLine();
17: Console.WriteLine(e.Source);
18: Console.WriteLine();
19: Console.WriteLine(e.StackTrace);
20: Console.WriteLine();
21: Console.WriteLine(e.TargetSite);
22: Console.WriteLine();
23: Console.WriteLine(e.ToString());
24: }
25: }
26: }
27: } |
|
例外クラスの機能を使用したサンプル・プログラム14 |
例外クラスが持っているプロパティやメソッドにアクセスしている。 |
これを実行すると以下のようになる。
|
サンプル・プログラム14の実行結果 |
上から順に、指定されたメッセージ(Messageプロパティ)、例外が発生したプログラム名(Sourceプロパティ)、メソッドが呼び出された順番(StackTraceプロパティ)、例外が発生したメソッドの情報(TargetSiteプロパティ)、例外の内容を示す文字列(ToStringメソッド)が出力されている。
|
ソースの15行目以降と実行結果画面を対比しながら見ていただきたい。まず、Messageプロパティは、例外発生時に指定されたメッセージを持つ。Sourceプロパティは例外の起きたプログラムの名前(正確にはアセンブリの名前)を持つ。場合によってはオブジェクトの名前になる場合もあるようだ。StackTraceはメソッドの呼び出された順番を示す文字列を持つ。例外をキャッチしないときに表示される、メソッドを羅列するあの文字列である。TargetSiteプロパティは、例外の発生したメソッドの情報を持つ。最後のToStringメソッドは、システムが例外の内容をコンソールに出力する場合と同じ書式の文字列を返す。もし、ログ・ファイルなどに例外の情報を保存しておきたい場合は、このメソッドで情報を取得して、それをファイルに保存するようにするとよいだろう。
さまざまな例外
システムに含まれる主立った例外を紹介する。
例外 |
内容 |
System.OutOfMemoryException |
メモリを使い切った |
System.StackOverflowException |
スタックが溢れた |
System.NullReferenceException |
nullへの参照にアクセスしようとした |
System.TypeInitializationException |
staticなコンストラクタが例外を発生させたが誰もキャッチしなかった |
System.InvalidCastException |
キャストの間違い |
System.ArrayTypeMismatchException |
配列の型が合わない |
System.IndexOutOfRangeException |
添え字の範囲から外れている |
System.ArithmeticException |
数値演算エラー(ゼロ除算やオーバーフローなど) |
System.DivideByZeroException |
ゼロ除算 |
System.OverflowException |
オーバーフロー |
|
システムに含まれる主な例外 |
念のために補足すると、ゼロ除算はArithmeticExceptionとDivideByZeroExceptionの両方でキャッチできるように読めるが、そのとおりである。DivideByZeroExceptionはArithmeticExceptionを継承しているので、ArithmeticExceptionをキャッチしようとすれば、自動的にDivideByZeroExceptionもキャッチ可能になるのである。OverflowExceptionも事情は同じである。このように例外クラスを階層化してカテゴライズするのも、例外をエレガントに使う戦略の1つである。
まとめ
エラー処理は、つい手を抜きたくなる個所かもしれないが、それを上手く記述するかどうかがソフトの品質を左右する。C言語や6.0以前のVisual Basicに比べれば、C#の例外は非常に強力であり、エラー処理も快適に記述できるようになったはずである。ぜひとも例外を活用して、トラブルに強いソースを書こう。
さて、次回はC#のプリプロセッサとコメントに記述するドキュメント機能について取り上げたいと考えている。
それでは次回もLet's See Sharp!
Insider.NET 記事ランキング
本日
月間