English 中文(简体)
最后的路障没有在4.0号网络上运行,为什么?
原标题:The finally block is not running on .NET 4.0, why?

既然如此,就是一个不容置疑的问题,我希望有人能够澄清一些情况。 我有以下法典:

static void Main(string[] args)
{
    try
    {
        Console.WriteLine("in try");
        throw new EncoderFallbackException();
    }
    catch (Exception)
    {
        Console.WriteLine("in Catch");
        throw new AbandonedMutexException();
    }
    finally
    {
        Console.WriteLine("in Finally");
        Console.ReadLine();
    }
}

Now when I compile this to target 3.5 (2.0 CLR) it will pop up a window saying "XXX has stopped working". If I now click on the Cancel button it will run the finally, and if I wait until it is done looking and click on the Close Program button it will also run the finally.

现在令人感兴趣和混淆的是,如果我对4.0所汇编的同一件事作一番,就在Cancel纽顿上点击,在Close Program纽顿”上点击。

我的问题是:为什么<代码>在2.0,而不是在4时打到Close Program纽顿? 这有什么影响?

<><>Edit>: 我是从732比照窗户的释放模式(以释放方式建立)迅速指挥的。 傲慢的电文:在窗户发现问题之后,以下第一波层的点击时间为3.5起,第二点是在4时,也是一样。

“Screenshot”/

问题回答

我现在能够照搬行为(在我第一次阅读这个问题时,我没有从你的问题中得出确切的步骤)。

我可以观察到的一个差别是这样。 该网络的运行时间处理的是未经处理的例外情况。 CLR 2.0 运行一个叫的助手 微软 NET Error Reporting Shim (dw20.exe ) 而CLR 4.0则开始Windows Error Reporting(WerFault.exe)。

我认为,两者在终止坠毁过程方面有不同的行为。 WerFault. 明显杀了。 该网络立即处理,而“网络”则立即处理。 NET Error Reporting Shim , somehow ends the application so that the final group still is executions.

还对事件观察者进行了研究:WerFault登录了一个申请错误,通知程序中断:

Application: ConsoleApplication1.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Threading.AbandonedMutexException
Stack:
   at Program.Main(System.String[])

dw20.exe 只记录一个信息项目,活动时间为1001美元,不终止程序。

想一想这种局面是多么可怕的:出现了一种意想不到的情况,即没有人写过处理守则。 难道在这种情况下做的正确事情是: 甚至更多的代码,这或许是 也是,不是用来处理这种情况的? 也许不是。 在这里做的事情常常是而不是<>m>,试图把最后部分放在一边,因为这样做会使情况更加糟糕。 你们已经知道这一进程正在崩溃,立即摆脱了痛苦。

在无处理例外的情况中,可能会出现 任何第条”。 此处的错误报告是否向视窗错报告,究竟是夸大的开端,等等。 《刑法》完全属于其试图最终分割块的权利,而且完全属于其迅速失败的权利。 在这种情形下,所有物品都被排除在外;不同的执行可以选择做不同的事情。

我关于这个问题的所有知识都来自本条款:CLR Inside Out - Unhandled specialionprocess in The CLR。 请注意,该文件为2.0,但我感觉到,我们在此案中所经历的情况(不仅仅是“它决定”任何途径)是有意义的。

快速“我没有时间阅读该条”答案(尽管你应该说,这确实是好的):

问题的解决办法(如果你绝对同意你最后的区块)是:(a) 建立一支全球性的错误手或(b)部队。 该网络总是最后发挥作用,并且以什么方式(明显错误的方式)运作。 NET 1.1 - 将下列内容列入阁下的议事日程:

<legacyUnhandledExceptionPolicy enabled="1">

The reason for it: When an exception is thrown in .NET it starts walking back through the stack looking for exception handlers and when it finds one it then does a second walk back through the stack running finally blocks before running the content of the catch. If it does not find a catch then this second walk never happens thus the finally blocks are never run here which is why a global exception handler will always run finally clauses as the CLR will run them when it finds the catch, NOT when it runs it (which I believe means even if you do a catch/throw your finally blocks will still get run).

app鱼板工程的原因是,CLR有1.0和1.1的全球渔获量,在不管理之前,会吞.例外,这当然会引发最后的块块。 当然,框架无法充分了解处理这种例外情况,比如说是过度流动,因此,这样做可能是错误的。

下一个轨道是哪里有点 stick,而我是根据该条在这里所说的。

如果你在www.NET 2.0+中,没有处理遗留问题的例外情况,那么你的例外情况就将归入视窗例外处理系统(SEH),该系统似乎与CLR本身相似,因为它在找不到渔获物之前绕行,然后打电话到一系列称为“无处理例外”的事件。 这是你可以同意的一件事,但是,它只能在某个时候收到一件签名,因此,当有人确实把视窗交给它处理之前的电话时,就让你建立起一个UEF处理器的链条——BUT THEY DON T HAVE到HONOR地址,他们应该说话,但如果有人打破了链条,浏览,你就不再处理错误。 我假定,这是你取消窗口错误报告时发生的事,它打破了欧安论坛的链条,这意味着申请立即关闭,最后区块没有运行,但是,如果你让它最终结束并关闭,它就会把下一个欧安论坛称作链。 。 NET本将登记<代码>。 AppDomain. UnhandledException is calls from (thus Even this event is not guarantee) which is also where mothers from - as I can t see how You never transition into the CLR a management final/2005/4 can su. (the article do not go into this bit).

我认为,这可以与如何随同变换。

。 NET Framework 4 Migration Issues document:

当变迁者未能开工时,或者在没有登记的夸大者应当开工时,不再通知你。

情况是,你选择开始夸张,但你取消。 我认为,这属于这一类,因此申请只是停留。

在释放和减标两方面,在框架3.5和4.0中,我看到“最后”从指挥线上运行,到关闭我的会议,也许在你的机器上做一些事情,或者正如科比所指出的,可能与平台有关(Im on Win7×64)





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...