事实上,我尝试对我的代码进行防错,但最终使它看起来相当混乱。
我设置了一个函数来读取某种类型的文件。我希望函数在出现问题时返回 false,如果一切正常则返回 true。我无法弄清楚如何构建一切。
我有一个尝试打开文件流的初始 try-catch 块。但在那之后,我在读取过程中进行了某些其他检查,例如文件大小和某些偏移处的值。我设置它的方式是使用 if else 语句。例如:
if(condition){
}
else{
MessageBox.Show("There was an error");
br.Dispose();
fs.Dispose();
return false;
}
...br 是二进制读取器,fs 是文件流。像这样的块有很多,多次编写相同的内容似乎是不好的做法。首先想到的是将整个事情包装在 try-catch 语句中并抛出异常,而不是使用 if else 块。我记得在阅读有关 try-catch 语句的内容时,拥有它们很好,但不要用它们包装所有内容。老实说,我仍然不完全理解为什么将所有内容都包装在 try catch 语句中是不好的做法,因为它们只有在出现错误时才会起作用,在这种情况下程序无论如何都会出错......
另外,我是否必须关闭二进制读取器和文件流,或者关闭其中一个会关闭另一个吗?有什么方法可以使用它们而不必丢弃它们吗?
如何利用using
关键词?这包含了您对IDisposable
在 try-finally 块中;
bool success = true;
using(var fs = new FileStream(fileName, FileMode.Create)))
using(var br = new BinaryReader(fs))
{
// do something
success = result;
}
return success;
嵌套的 using 块将确保文件流和二进制读取器始终正确关闭和处置。
你可以阅读有关在 MSDN 中使用的更多信息 http://msdn.microsoft.com/en-us/library/yh598w02.aspx。它利用IDisposable
更加简洁,消除了显式异常处理的需要。
关于您的发言:
我记得在阅读有关 try-catch 语句时,最好
拥有它们,但不要用它们包裹所有东西。
我总是使用一个简单的规则:如果我无法处理特定代码块中的异常并从中恢复,请不要尝试捕获它。允许异常在堆栈中“冒泡”到更有意义的位置来捕获它。通过这种方法,您会发现不需要添加许多 try-catch 块,您将倾向于在与服务(例如文件系统、网络等)集成时使用它们,但您的业务逻辑几乎总是没有异常处理机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)