我最近与一位同事讨论过,他告诉我我正在错误地将流管理到 try/catch/block 中。所以我想知道什么对你来说是个好方法。
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;
}
}
他说,即使使用 IOException,也不需要有 2 个异常。我们只能使用异常。但我唯一想要的是识别出异常究竟是在哪里产生的,因为打开文件后,将执行大约 30 秒的操作。
那么你会怎么想?我们看到了这个 MS 示例 ( http://msdn.microsoft.com/fr-Fr/library/system.io.streamreader.aspx ),它更简单,但就性能或干净的代码而言,你觉得有些奇怪吗?
请发表您的意见!
-编辑 - - - - - - - - -
好的,我明白了这一点,但我们正在讨论 Catch IOException 并且只是使用 Exception。在我看来,就像上面的例子一样,你可以知道错误发生在哪里;在管理文件的那一刻或打开文件后的过程中。这是我的第一个问题。现在,您如何看待下面的这种变化。
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;
}
}
-------------------编辑2------------
最后,我希望这将是我的最终解决方案。非常感谢您的回答。因此使用更快、更高效,并且只需要一个例外。
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);
}
任何其他评论将不胜感激!