如何使用尝试/捕获/最终C#有效地管理流



>我最近和一位同事讨论过,他告诉我,我正在将一个流管理成一个尝试/捕获/阻止。所以我想知道什么对你来说是一个好方法。

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),它更简单,但就性能或干净的代码而言,您发现一些奇怪的东西?

请发表您的意见!

-编辑-----------------

好的,我明白了,但我们讨论的是捕获IOException并仅使用异常。在我看来,就像上面的例子一样,您可以知道错误发生的位置;在管理文件的那一刻或在打开文件后的过程中。这是我的第一个问题。现在,您如何看待下面的这种变化。

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);
}

任何其他评论将不胜感激!

您可以使用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 
}

不要捕获异常只是为了立即抛出相同的异常,只是现在信息较少,并且缺少异常实际发生位置的堆栈帧。

如果我遇到类似的东西

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

在代码审查中,我将失败该审查(不仅仅是因为语法和拼写错误;-)

至少,您应该将其与原始异常一起作为内部异常。

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

但坦率地说,在此示例代码中,它没有添加任何内容,最好完全删除 imo。

如果要重新抛出异常而不是捕获它,为什么要费心创建新的异常?你正在丢弃有价值的信息。捕获异常只是为了再次抛出它实际上是没有意义的。替换有用的异常(例如,它拥有上游任何人可能需要的所有诊断信息)并将其替换为通用异常也没有任何意义。

对于您的情况,我只想:

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

您的所有其他改进都恰恰相反。

相关内容

  • 没有找到相关文章

最新更新