つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

C#における throw と throw ex の違い

C#で例外処理を行う場合try-catch構文を使用します。*1
catch句で取得した例外を呼び出し元に通知するためにはthrowステートメントを使用しますが、このthrowステートメントに例外変数を添えるか添えないかで、受け取った側の内容に違いが出ることを最近になって知りました。
ということで忘れないようメモします。

サンプルプログラム

throw と throw ex の違いを説明する前に、下記の検証用のプログラムを用意します。
38行目で強制的に例外を発生させています。そして31行目と32行目をコメントで切り替えて、結果を検証します。

gist6685679

動作結果

throw

gist6685797

throw ex

gist6685807

結果の違い

サンプルプログラムを見ると、関数Method2()で例外が起きています。 throwの例外内容ではきちんとMethod2()で例外が発生し、38行目が実際の例外箇所だということが分かります。 しかしthrow exの例外内容では、34行目が例外の発生箇所となっています。
これではどのような処理のせいで例外が発生したか分かりませんね。

この通り、例外処理でthrowステートメントを使用する場合は、例外変数は添えずに実装しないと、例外の原因となっている箇所の特定は難しいということになります。
勉強になりました。

余談

はてなブログの記事にGistが貼り付けられるようになったんですね!*2

C#実践開発手法 (マイクロソフト公式解説書)

C#実践開発手法 (マイクロソフト公式解説書)