>我最近和一位同事讨论过,他告诉我,我正在将一个流管理成一个尝试/捕获/阻止。所以我想知道什么对你来说是一个好方法。
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
}
您的所有其他改进都恰恰相反。