创建新项目时,未处理的异常会产生奇怪的行为。这是我可以重现此问题的方法:
1)创建一个新的Windows窗体应用程序(C#、. NET Framework 4,VS2010)
2)将以下代码添加到Form1_Load处理程序中:
Form1_Load
int vara = 5, varb = 0; int varc = vara / varb; int vard = 7;
我希望VS中断并在第二行显示未处理的异常消息。但是,发生的情况是仅跳过了第三行而没有任何消息,并且应用程序继续运行。
我现有的C#项目没有这个问题。所以我想我的新项目是用一些奇怪的默认设置创建的。
有谁知道我的项目有什么问题吗???
我尝试选中“调试”->“异常”中的复选框。但是,即使我在一个try- catch块中处理异常,执行也会中断;这也不是我想要的。如果我没记错的话,此对话框中有一列“未处理的异常”或类似的内容,它们可以满足我的要求。但是在我的项目中,只有一列(“引发”)。
try- catch
这是wow64仿真层引起的一个令人讨厌的问题,它允许32位代码在64位版本的Windows 7上运行。它吞噬了响应64位窗口管理器生成的通知而运行的代码中的异常。 ,就像Load活动一样。阻止调试器看到它并介入。这个问题很难解决,Microsoft的Windows和DevDiv组正在来回指责。DevDiv对此无能为力,Windows认为这是正确且有据可查的行为,听起来像是神秘的。
Load
它当然有据可查,但几乎没有人了解后果或认为这是合理的行为。当然,尤其是当窗口过程从视图中隐藏时,尤其是在使用包装程序类来隐藏窗口管道的任何项目中,这种情况尤其如此。像任何Winforms,WPF或MFC应用程序一样。根本的问题是Microsoft无法弄清楚如何将异常从32位代码流回到触发通知的64位代码,再流回到尝试处理或调试异常的32位代码。
连接调试器只是一个问题,您的代码将像往常一样炸毁而没有一个。
项目>属性>生成选项卡>平台目标= AnyCPU并取消选中“首选32位”。您的应用程序现在将作为64位进程运行,从而消除了wow64故障模式。某些后果是,它会禁用VS2013之前的VS版本的“编辑+继续”功能,并且当您依赖于32位代码时,可能并非总是可能的。
其他可能的解决方法:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
Main()
ThreadException