使用finally
之间有什么区别void ReadFile(int index)
{
// To run this code, substitute a valid path from your local machine
string path = @"c:\users\public\test.txt";
System.IO.StreamReader file = new System.IO.StreamReader(path);
char[] buffer = new char[10];
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
Console.WriteLine("Error reading from {0}.
Message = {1}", path, e.Message);
}
finally
{
if (file != null)
{
file.Close();
}
}
// Do something with buffer...
}
并没有使用它?
void ReadFile(int index)
{
// To run this code, substitute a valid path from your local machine
string path = @"c:\users\public\test.txt";
System.IO.StreamReader file = new System.IO.StreamReader(path);
char[] buffer = new char[10];
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
Console.WriteLine("Error reading from {0}.
Message = {1}", path, e.Message);
}
if (file != null)
{
file.Close();
}
// Do something with buffer...
}
答案 0 :(得分:7)
前一个示例将运行file.Close()
,无论是抛出异常还是抛出异常。
后者仅在未抛出异常或抛出System.IO.IOException
时才会运行。
答案 1 :(得分:3)
不同之处在于,如果您不使用finally
并且抛出IOException
以外的异常,则您的应用程序将泄漏文件句柄,因为永远不会到达.Close
行
在处理诸如流的可支配资源时,我个人总是使用using块:
try
{
using (var reader = File.OpenText(@"c:\users\public\test.txt"))
{
char[] buffer = new char[10];
reader.ReadBlock(buffer, index, buffer.Length);
// Do something with buffer...
}
}
catch (IOException ex)
{
Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
}
这样我就不用担心正确处理它们了。 try / finally内容由编译器处理,我可以专注于逻辑。
答案 2 :(得分:1)
您的catch块本身可能会抛出异常(考虑path
为null-reference时的情况)。或者try
块中抛出的异常不是System.IO.IOException
,因此不会处理。除非使用finally
,否则在两种情况下都不会关闭文件句柄。
答案 3 :(得分:0)
在你的情况下,没有。如果你让异常被抛出catch块,那么finally部分就会运行,但另一个变种不会。