連載改訂版 C#入門第18章 例外とエラー処理 |
![]() |
18-9 例外を再発生させてのエラー処理
ただ単に例外をキャッチして処理を行うだけでは不十分な場合がある。例えば、1つの例外について、別々の階層のメソッド内の別々のcatch文でエラー処理を行う必要が生じる場合がある。このような場合、catchブロック内で、さらにもう一度同じ例外を発生させる必要が出てくる。このようなケースでは専用の構文が使用できる。List 18-12はそれを使用したサンプル・ソースである。
|
|
| List 18-12 |
これを実行するとFig.18-10のようになる。
![]() |
| Fig.18-10 |
List 18-12では、15行目で発生する例外を27行目からのcatchブロックでキャッチしているが、ここでキャッチしなければ40行目からのcatchブロックでもキャッチされるはずのものである。両方でエラー処理を行いたい場合は、27行目からのcatchブロック内でもう一度同じ例外を発生させ、40行目からのcatchブロックに実行するチャンスを与える必要がある。そのために、例外を再発生させているのが30行目のthrow文だが、見てのとおり、同じ例外を再発生させる場合は例外インスタンスを指定する必要はない。
18-10 例外クラスを自作する
例外で使用するクラスは、Exceptionクラスを継承していればよい。つまり、自分でExceptionクラスを継承したクラスを作れば、それも利用できる。実際に記述してみた例がList 18-13である。
|
|
| List 18-13 |
これを実行するとFig.18-11のようになる。
![]() |
| Fig.18-11 |
Fig.18-11を見て分かるとおり、MyExceptionはシステムから例外の一種として認知されており、問題なくコンソールに情報が出力されている。Exceptionクラスには3つのコンストラクタがあるが、よく使われるのは文字列の引数が1個のものである。これは9行目のように、引数をちゃんと親クラスに渡してやらないとエラーになってしまうので、そのように記述する必要がある。それ以外は、プログラマーが必要だと思う機能をこのクラスに書き加えてよい。
このような自作例外クラスを用意すると自作プログラム内のエラー処理を円滑に行える場合もあるので、覚えておくとよいだろう。例え、自作例外クラス内に機能らしい機能が必要とされていないとしても、例外を区別できるというだけでメリットがある場合も多い。
18-11 例外クラスのインスタンスを活用する
いうまでもなく、例外クラスのインスタンスはインスタンスであるからメソッドやプロパティを持つ。Exceptionクラスには有益な情報を得られるメソッドやプロパティがあるので、それを使ってみよう。List 18-14を見てほしい。
|
|
| List 18-14 |
これを実行するとFig.18-12のようになる。
![]() |
| Fig.18-12 |
List 18-14の16行目以降とFig.18-12を対比しながら見ていただきたい。まず、Messageプロパティは、例外発生時に指定されたメッセージを持つ。Sourceプロパティは例外の起きたプログラムの名前(正確にはアセンブリの名前)を持つ。場合によってはオブジェクトの名前になる場合もあるようだ。StackTraceはメソッドの呼び出された順番を示す文字列を持つ。例外をキャッチしないときに表示される、メソッドを羅列する文字列である。TargetSiteプロパティは、例外の発生したメソッドの情報を持つ。最後のToStringメソッドはシステムが例外の内容をコンソールに出力する場合と同じ書式の文字列を返す。もし、ログファイルなどに例外の情報を保存しておきたい場合は、このメソッドで情報を取得して、それをファイルに保存するようにするとよいだろう。
18-12 さまざまな例外
システムに含まれる主立った例外をTable 18-1に紹介する。
| 例外 | 意味 |
| System.OutOfMemoryException | メモリを使い切った |
| System.StackOverflowException | スタックがあふれた |
| System.NullReferenceException | nullへの参照にアクセスしようとした |
| System.TypeInitializationException | staticなコンストラクタが例外を発生させたが、だれもキャッチしなかった |
| System.InvalidCastException | キャストの間違い |
| System.ArrayTypeMismatchException | 配列の型が合わない |
| System.IndexOutOfRangeException | 添え字の範囲から外れている |
| System.ArithmeticException | 数値演算エラー(ゼロ除算やオーバーフローなど) |
| System.DivideByZeroException | ゼロ除算 |
| System.OverflowException | オーバーフロー |
| Table 18-1 | |
念のために補足すると、ゼロ除算はArithmeticExceptionとDivideByZeroExceptionの両方でキャッチできるように読めるのは、そのとおりである。DivideByZeroExceptionはArithmeticExceptionを継承しているので、ArithmeticExceptionをキャッチしようとすれば、自動的にDivideByZeroExceptionもキャッチ可能になるのである。OverflowExceptionも事情は同じである。このように例外クラスを階層化してカテゴライズするのも、例外をエレガントに使う戦略の1つである。![]()
『新プログラミング環境 C#がわかる+使える』本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て一部分を転載したものです。 【本連載と書籍の関係について 】 この書籍は、本フォーラムで連載した「C#入門」を大幅に加筆修正し、発行されたものです。連載時はベータ版のVS.NETをベースとしていましたが、書籍ではVS.NET製品版を使ってプログラムの検証などが実施されています。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。 →技術評論社の解説ページ ご注文はこちらから |
| INDEX | ||
| 改訂版 C#入門 | ||
| 第18章 例外とエラー処理 | ||
| 18-1 例外とは何か? | ||
| 18-3 例外を区別して扱う | ||
| 18-6 finally文はbreak文やreturn文でも有効 | ||
| 18-9 例外を再発生させてのエラー処理 | ||
| 「連載:改訂版 C#入門」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -






