5

I recently discussed with a coworker who told me that I was managing incorrently a stream into a try / catch / block. So I wanna know what would be a good approach for you.

try
{
    StreamReader sr = new StreamReader("TestFile.txt");
    //After that, here an operation of about 30 seconds to fulfill;
}
catch (IOException ioex)
{
    throw new IOException("An error occurred while processing the file.", ioex);
}
catch (Exception ex)
{
    throw new Exception("An generic error ocurred.");
}
finally
{
    if(sr != null){
        stream.Close();
        stream = null;
    }
}

He stated that having 2 Exception are unnecessary, even using the IOException. We can use only Exception. But the only thing that I want is to recognize where exactly the exception has been produced, because after opening the file, an operation of about 30 seconds will be performed.

So what would you think? We saw this MS example (http://msdn.microsoft.com/fr-Fr/library/system.io.streamreader.aspx) which it's simplier but in terms of performance or clean code, you find something strange?

Your opinions please!

-EDIT-----------------

Ok, I see the point but we were discussing about the Catch IOException and just using the Exception. In my opinion, like as in the example above you can know where the error ocurred; at the moment of managing the file or in the process after opening the file. That's my first question. And now, what do you think about this change below.

try
{
    using(StreamReader sr = new StreamReader("TestFile.txt"))
    {
        //After that, here an operation of about 30 seconds to fulfill;
    }
}
catch (Exception ex)
{
    throw new Exception("An generic error ocurred.");
}
finally
{
    if(sr != null){
        stream.Close();
        stream = null;
    }
}

-------------------EDIT 2------------------------

Finally, I hope this would be my final solution. Thank you so much for your answers. So using is faster, efficient and just one exception is necessary.

try
{
    using (StreamReader stream = sr = new StreamReader("TestFile.txt"))
    {
        //Operation
    }
}
catch (Exception e)
{
    throw new Exception(String.Format("An error ocurred while executing the data import: {0}", e.Message), e);
}

Any other comment would be appreciated!

4

3 に答える 3

13

以下のようにブロックを使用できusing、例外が発生した場合でもストリームを破棄します

using (StreamReader sr = new StreamReader("TestFile.txt"))
{
   // do something with sr
}

あなたが何かをしようとしているなら、例外をキャッチしてください。問題を解決できなければ、それを捕まえても意味がありません。

例外を解決できない場合は、例外をバブルアップさせてそこでキャッチすることをお勧めします。

try
{
    using(StreamReader sr = new StreamReader("TestFile.txt"))
    {
       // your code 
    }
}
catch (IOException ioex)
{
    // do something to fix the problem 
    // log the exception 
}
于 2013-10-31T02:36:16.707 に答える
7

同じ例外をすぐにスローするためだけに例外をキャッチしないでください。情報が少なくなり、例外が実際に発生した場所のスタック フレームが欠落している場合に限ります。

私が何かに出くわした場合

catch (Exception ex)
{
   throw new Exception("An generic error ocurred.");
}

コードレビューでは、そのレビューに失敗します(文法やスペルの間違いだけではありません;-)

少なくとも、元の例外を内部例外としてスローする必要があります。

catch (Exception ex)
{
    throw new Exception("A generic error occurred.", ex)
}

しかし、率直に言って、このサンプル コードでは何も追加していません。完全に削除した方がよいでしょう。

于 2013-10-31T03:04:50.610 に答える
4

例外をキャッチするのではなく再スローしている場合、わざわざ新しい例外を作成する必要はありません。あなたは貴重な情報を捨てています。文字通り、例外をキャッチして再度スローするだけでは意味がありません。また、有用な例外を置き換えて (つまり、アップストリームの誰もが必要とする可能性のあるすべての診断情報が含まれているため)、それを一般的な例外に置き換えても意味がありません。

あなたの状況では、私は単に:

using(var sr=new StreamReader())
{
    //some code
}

他のすべての改善はまったく逆です。

于 2013-10-31T03:03:28.950 に答える