C#无法捕捉到*Exception或看看它发生了什么

问题描述:

我知道这非常含糊,但这是我可以收集的。我希望有人对这种情况如何发生有所了解。C#无法捕捉到*Exception或看看它发生了什么

我有我的Win 7 64位机器上运行64位程序,内置在Visual Studio 2012

它使用位于另一个项目(编译为DLL)的一类。该类有一个可能导致堆栈溢出的错误迭代器。调用错误迭代器的操作通过任务调用。

所以在我的程序,代码如下所示:

new Task(()=>{ 
try 
{ 
    DoWork(); //<-- buggy iterator is called inside 
} 
catch (Exception ex) 
{ 
    //Exception reported to user 
} 
}).Start(); 

的代码是在相同的数据,每次执行,并具有参与所以每次应该产生相同的输出没有随机变量或GUID生成。

大多数情况下,它会崩溃*Exception发生在未知模块(即使我知道事实上它发生的确切位置)。如果发生这种情况,我无法查看溢出发生的代码,try-catch块什么也不做!我无法继续执行程序(如果我运行它而不进行调试,它显示“程序必须关闭,让我们在线检查解决方案”系统窗口)。

现在,它有时会捕获异常(显示导致异常的代码中的正确位置)。这是随机的,但如果我更频繁地中断任务(如在工作期间随机插入断点),似乎会发生更多。

但是,我仍然无法继续申请。即使异常发生在应该捕获*Exception的try-catch块内(它应该被捕获,因为*Exception包含在Exception中 - C#不会让你捕获它们并明确告诉你SOE已经包含在E中)。

我试图制作一个小程序,在try-catch块内部蓄意堆栈溢出,它也显示“程序必须关闭让我们在线检查解决方案”系统窗口,而不是正确处理。下面的代码:

private bool Overflow() 
    { 
     return Overflow(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try { Overflow();} 
     catch (*Exception ex) { } 
    } 

所以,我有几个问题:

问题1:

是否有可能赶上*Exceptions永远不会消失?我该怎么做?

问题2:

当堆栈溢出您的DLL(在相同的解决方案等项目)内发生的,有什么可以让VS 2012调试器认为它是“未知模块”?

问题3:

为什么做一些奇怪的魔法舞蹈与部落乐器使得它做到这一点往往少吗? (我的意思是随机打破程序进行中)

总体而言,发生了什么事?

在此先感谢

你不允许搭上真正堆栈溢出异常,这就是为什么它不会工作。

另请参阅this讨论。

我不能回答你的第二个问题,除了说“该程序真的搞砸了”。

对于第三个问题:因为它在一个单独的线程中运行,所以它运行的代码量将根据您何时中断程序而有所不同。我认为只有通过一些繁琐的逐行调试,或者大量的Debug.WriteLine()才能实现这一点。

+0

在这个讨论中,他们说如果CLR在托管环境中运行,主机特别允许处理*异常*,那么可以捕获它。我怎么做才能让这些例外得到处理? – Istrebitel 2013-04-09 08:45:47

+0

您如何托管CLR环境?凡人不能轻易...这是对于像SQL服务器和调试器的东西。有关更多详细信息,请参见[此处](http://*.com/questions/2348207/what-is-clr-hosting)。准备用C++编写主机。 – 2013-04-09 11:06:50

1)从.NET Framework 2.0版开始,*Exception对象不能被try-catch块捕获,并且相应的进程默认终止。因此,建议用户编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。请注意,承载公共语言运行库(CLR)的应用程序可以指定CLR卸载发生堆栈溢出异常的应用程序域,并让相应的进程继续。有关更多信息,请参阅ICLRPolicyManager接口和主机概述。 (http://msdn.microsoft.com/en-us/library/system.*exception.aspx