【发布时间】:2015-08-20 09:37:01
【问题描述】:
在我们的框架中,有一些具有文件句柄或 WCF 客户端连接的关键对象。这些对象是IDiposable,我们有验证代码(抛出异常)以确保它们在不再需要时得到正确处理。 (仅调试,以便我们不想在发布时崩溃)。这不一定是关机。
除此之外,我们还有运行代码的单元测试,因此如果我们忘记了这些处理,我们预计它们会失败。
问题是:在.NET 4.5.1 上,当Finalizer 中的此类异常为扔了。
奇怪的是:使用NCrunch(也超过了NUnit),单元测试DO失败了! (这对我来说在本地,至少我可以找到这样丢失的处置)
这很糟糕,因为我们的构建机器(TeamCity)没有看到这样的失败,我们认为一切都很好!但是运行我们的软件(在调试中)确实会崩溃,表明我们忘记了处理
这里有一个例子表明 NUnit 没有失败
public class ExceptionInFinalizerObject
{
~ExceptionInFinalizerObject()
{
//Tried here both "Assert.Fail" and throwing an exception to be sure
Assert.Fail();
throw new Exception();
}
}
[TestFixture]
public class FinalizerTestFixture
{
[Test]
public void FinalizerTest()
{
CreateFinalizerObject();
GC.Collect();
GC.WaitForPendingFinalizers();
}
public void CreateFinalizerObject()
{
//Create the object in another function to put it out of scope and make it available for garbage collection
new ExceptionInFinalizerObject();
}
}
在 NUnit 运行器中运行它:一切都是绿色的。 让 ReSharper 调试这个测试确实会进入 Finalizer。
【问题讨论】:
-
暂时不要使用终结器。假设您有一个创建新线程的 NUnit 测试,该线程运行抛出的代码。测试失败了吗? (不是反问;我不知道。)如果测试确实失败了,测试通过什么机制检测到另一个线程上的异常?如果它没有失败,那么当它是终结器线程时,为什么你会期望情况会有所不同?
-
好点埃里克!你是对的,NUnit 不会在另一个线程上捕获异常!所以我找到了一些关于它的提示,并且会找到一个正确的方法来解决它!谢谢!