2011-06-20 11 views
4

tryブロックの内部でストリームを作成し、例外が発生した場合、ストリームは自動的に破棄されますか?例:ストリームはtry/catch文で自動的に処理されますか?

try 
{ 
    Stream stream = response.GetResponseStream(); 
    //Error Occurs 
    stream.Close(); 
} 
catch 
{ 
    //Handle Error 
} 

これは方法ではない場合は、アプローチを提案できますか?

答えて

15

いいえ、あなたはfinally

Stream stream; 
try 
{ 
    stream = response.GetResponseStream(); 
    //Error Occurs 
} 
catch 
{ 
    //Handle Error 
} 
finally 
{ 
    if(stream != null) 
     stream.Close(); 
} 

を使用したり、自動的にClose()を呼び出すusing文でごStream宣言/定義をラップする必要があります。私の2

try 
{ 
    using(Stream stream = response.GetResponseStream()) 
    { 
     //Error happens 
    } 
    //stream.Dispose(), which calls stream.Close(), is called by compiler here 
} 
catch 
{ 
    //Handle Error 
} 

注意を例は正確に相当ではありません - 最初はe受理が処理される前にsteam.Close()が呼び出され、2番目に例外が処理されます。

5

この場合、ストリームは自動的に閉じられません。

このコンテキストで確実に閉じたい場合は、finallyを使用して終了させます。

代わりに、私はストリーム全体を使用してラップします。

using(Steam stream = response.GetResponseStream()) 
{ 
// Do your work here 
} 
1

答えはありません。コードの周りに例外処理ロジックがある場合は、finallyブロック内のすべてのリソースを閉じることをお勧めします。

2

(リソース)ステートメントを使用すると、disposeを呼び出す処理が行われます。常に処分を確保するために

1

ありませんが、関係なく、例外の、あなたが使用します。

try 
{ 
    Stream stream = response.GetResponseStream(); 
    //Error Occurs 
} 
catch 
{ 
    //Handle Error 
} 
finally 
{ 
    if(stream!=null) 
     stream.Close(); 
} 

または単に:

using (Stream stream = response.GetResponseStream()) 
{ 
} 
3
using (Stream stream = response.GetResponseStream()) 
{ 
} 

Dispose()は、スコープの終了時に呼ばれています。これはIDisposableオブジェクトのクリーンアップを行うための正しいイディオムです。

5

いいえ、usingブロックを使用してください。エラーが発生しても、ブロックが終了するとDisposeが自動的に呼び出されます。

例えば、

using (Stream stream = response.GetResponseStream()) 
{ 
    // do something with stream 
} 

それは同じだ:ネット上の多くの例がありますが

Stream stream = null; 
try 
{ 
    stream = response.GetResponseStream(); 
    // do something with stream 
} 
finally 
{ 
    if (stream != null) 
     stream.Dispose(); 
} 

。簡単なGoogleは、すでにstackoverflow上で次のことを明らかにしました:'using' statement vs 'try finally'

1

ストリームはIDisposableインターフェイスを実装しています。 クラスがIDisposableを実装する場所でusing()ステートメントを使用できます。 これは、最終的に書かずにオブジェクトを閉じて処分する処理を自動的に行います。

 try 
     { 
      using (var stream = response.GetResponseStream()) 
      { 
       //Error happens 
      } 
     } 
     catch 
     { 
      //Handle Error 
     } 
関連する問題