奇怪的异常处理,try--finally
我开.Net书的时候都是说using语句块相当于try--finally块,可是在我的一个项目中我发现了一个问题。代码如下:
using(DataSet ds = GetDataSet())
{
//Some statement, may throw exception.
}
程序运行时在这里跑出了异常导致程序崩溃了,我纳闷了,这怎么可能??
于是我做了一个实验,代码如下:
using System;
namespace Console1
{
public class Maina
{
public static void Main(string[] args)
{
Test t = null;
try
{
t = new Test();
t.Init();
}
finally
{
Console.WriteLine("finally");
}
using(Test t1 = new Test())
{
t1.Init();
}
}
}
public class Test : IDisposable
{
public Test()
{
}
public void Init()
{
throw new Exception("Test constructor");
}
public void Dispose()
{
Console.WriteLine("Class test disposed.");
}
}
}
编译以上代码成功并执行,问题出现了,在try块中t.Init()跑出的异常没捕获到,导致程序崩溃。我查了一下MSDN,得到如下信息:
finally 块用于清除在 try 块中分配的任何资源。控制总是传递给 finally 块,与 try 块的存在方式无关。
于是我不明白了,为什么t.Init处想异常后没有执行到finally中的Console.WriteLine("finally")呢??如果这样的话,finally到底能干什么?
怎么书上和MSDN 上讲的都与实际不符呢?还是我的测试有问题?
由于try--finally的问题,导致了using的问题,也就是说在using块中如果有异常没有捕获的话,资源不会被释放。
不知大家有没有发现此问题,欢迎讨论。