投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/8/19 10:48:17
# 長文になってしまったので、2 回にわけて投稿します。

>>> そもそも例外処理は必要なのでしょうか。
不要か必要かと問われれば必要と答えることにはなりますが、
それがどんな時に必要なのかは考慮せねばなりません。

.NET における「例外」とは、基本的には下記の状態を表すために使われる物です。
(Java の場合は、例外に対する考え方が微妙に異なっていたりしますが)
http://blogs.msdn.com/blogfiles/nakama/WindowsLiveWriter/.NETPart.1_E714/image5%5B1%5D.png

上記にあるように「異常事態」なのですから、開発者が責任を持って対処することが望ましいです。
ただしその対象方法とは、先述したように必ずしも例外処理を指すとは限りません。

ライブラリの設計者は、異常事態発生時に 例外をスローさせるように作りこみますが、
利用者としては、その例外をキャッチして対処するという選択肢の他に、そもそも
そうした異常事態を引き起こさないような作り方をするという選択肢があるからです。

たとえば、平均値を求めるメソッド(たとえば Enumerable.Average )に対して
0 個の値を渡した場合、当然ながら平均値を求めることはできません。
この場合 Averaga メソッドの作成者は、それを例外として返すように設計しますが、
利用する側としては、その例外を Catch して制御するという対処療法では無く、
そもそも 0 個の値を渡さないようにコーディングする事が求められるわけです。

Exception とはそもそも、本来の処理から逸脱した例外的な事態を
報告するための特殊な流れなので、そうした例外処理が乱発されてしまうと、
本来のプログラムが分かりにくくなる要因ともなります。その点はご注意を。


> ここでのスローとは何でしょうか。
単純に言えば、エラーを再発生させることです。

エラーを発生させるための「Err.Raise エラー番号」とか、「Throw 何某」と似ていますが、
「Throw」は、新たなエラーを通知するのではなく、現在処理中の例外を再通知させるために使います。


> 例外について調べていると、「スロー」という言葉が出てくるのですがよくわかりません。
「投げる」を意味する Throw です。
Catch ブロック内で「Throw」とだけ書きます。

この場合、捕まえた(Catch した)例外を再度投げなおす、という意味になります。
(具体的なサンプルを踏まえて書いた方が良いのかな…?)


なお、“ある程度理解が進んできたら”下記のblog記事が参考になるかと思います。
初心者向けの記事ではありませんし、C# 前提に書かれた記事ではありますが、
内容的には VB.NET 開発にも通ずるものがありますので。

[エラーチェックの体系的な分類方法]
http://blogs.msdn.com/b/nakama/archive/2009/09/29/9900569.aspx

[.NETの例外処理 Part.1]~[.NETの例外処理 Part.4]
http://blogs.msdn.com/b/nakama/archive/2008/12/29/net-part-1.aspx
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx
http://blogs.msdn.com/b/nakama/archive/2009/01/18/net-part-3.aspx
http://blogs.msdn.com/b/nakama/archive/2009/01/23/net-part-4.aspx