- 題名: 例外処理について
- 日時: 2006/03/07 0:16:57
- ID: 15446
- この記事の返信元:
- (なし)
- この記事への返信:
- [15447] Re[1]: 例外処理について2006/03/07 0:42:40
- [15472] Re[1]: 例外処理について2006/03/08 2:22:34
- ツリーを表示
■No15469に返信(YASさんの記事)
> 渋木宏明(ひどり)さんがおっしゃっていたような,この下のような記述に
> 近い動作になるということですね。
ひどりさんのスタイルでは、Close メソッドが正常系のみになります。(おそらく)
Using Reader As New StreamReader(...)
' Reader の処理
' :
reader.Close()
End Using
例外発生時は Dispose のみに一任するという解釈です。
私はおそらく YAS さんスタイルです。
このあたりは宗教論争と一緒で、正しいとか誤っているとかはないですよね。
わかっていて使っている、というのさえあれば OK だと思います。
________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
C#, VB.NET 入門 http://jeanne.wankuma.com/
じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
■No15475に返信(caferaさんの記事)
> こうして Close と using で記述して比較してみると変数 sr のスコープを狭く定義出来て、
> シンプルに記述できる using が良さそうですね。
1 番最後のソースは、"機構自体が違う" ので、
その前にある 2 つとスコープの比較対照をするのはおかしいですよね。
> using で Dispose する場合は、以下のようになります。
>
> try
> {
> using ( StreamReader sr = new StreamReader( "test.txt" ) )
> {
> throw new Exception();
> }
> }
> catch
> {
> // sr は using によって Dispose されて null です。または
> // インスタンス作成時に例外が発生したため、null です。
> }
これとほぼ等価な try 〜 finally パターンはこうです。
try {
StreamReader sr = null;
try {
sr = new StreamReader("test.txt");
throw new Exception();
} finally {
if (sr != null) {
((System.IDisposable)sr).Dispose();
}
}
} catch {
// 何らかの例外が発生した
}
こちらと比較して「シンプルで良いですね」なら良いのです。
ただし理由は 「finally に "わざわざ記述しなくて良いので"」に過ぎません。
> catch
> {
> // sr は using によって Dispose されて null です。または
> // インスタンス作成時に例外が発生したため、null です。
> }
3 番目のここですが、「インスタンス作成時に例外が発生したため」とは限りませんね。
ここでの catch 句のスコープを考えてみてください。
(実際、現状のコードは「インスタンス作成時」以外で発生していますし)
> sr のスコープを狭く定義出来て、シンプルに記述できる using が良さそうですね。
とありますが、例外機構の範囲を長くすることのデメリットは無視するのでしょうか?
■No15472に返信(YASさんの記事)
> では,最初の質問に戻ると,
> (code snip)
> または,
> (code snip)
> という感じでしょうか。
【私の場合】
[Using パターン]
Using sr As New System.IO.StreamReader(...)
Try
:
:
:
Finally
If sr IsNot Nothing Then
sr.Close()
End If
End Try
End Using
[Try 〜 Finally パターン]
Dim sr As System.IO.StreamReader
Try
sr = New System.IO.StreamReader(...)
Try
:
:
:
Finally
If sr IsNot Nothing Then
sr.Close()
End If
End Try
Finally
If sr IsNot Nothing Then
sr.Dispose()
End If
End Try
【ひどりさんの場合】
[Using パターン]
Using sr As New System.IO.StreamReader(...)
:
:
sr.Close() ' 正常系のみ (例外が発生した場合は Dispose はされるので大丈夫)
End Using
ということでしょう。
宗教的なものであり、どちらも間違いではありません。
分類:[.NET]
ファイルをStreamReaderで読み込むさい、
もしファイルが存在しない場合例外をキャッチしたいのですが、
次のようにするとsrが宣言されていませんとエラーが出ます。
どのように処理をするべきなのでしょうか…。
Try
Dim sr As New System.IO.StreamReader("file.dat", _
System.Text.Encoding.GetEncoding(65001))
Catch ex As Exception
MessageBox.Show(ex.Message, "例外")
End Try
Dim strLine As String = sr.ReadLine()
sr.Close()