連載

C#入門

第18回 例外とエラー処理

(株)ピーデー
川俣 晶
2001/12/22


例外クラスのインスタンスを活用する

 いうまでもなく、例外クラスのインスタンスは、インスタンスなので、メソッドやプロパティを持つ。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!End of Article


 INDEX
  第18回 例外とエラー処理
    1.例外とは何か?
    2.例外を区別して扱う
    3.確実な終了処理を行うfinally
    4.深い階層からの例外
    5.例外処理の再発生
  6.例外クラスのインスタンスを活用する
 
「C#入門」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間