当我创建一个新项目时,我对未处理的异常会有一个奇怪的行为.这就是我可以重现问题的方法:
1)创建一个新的Windows窗体应用程序(C#,. NET Framework 4,VS2010)
2)将以下代码添加到Form1_Load处理程序:
int vara = 5, varb = 0;
int varc = vara / varb;
int vard = 7;
Run Code Online (Sandbox Code Playgroud)
我希望VS中断并在第二行显示未处理的异常消息.但是,会发生的是第三行只是跳过而没有任何消息,应用程序一直在运行.
我现有的C#项目没有这个问题.所以我想我的新项目是用一些奇怪的默认设置创建的.
有没有人知道我的项目有什么问题?
我试过检查Debug-> Exceptions中的方框.但即使我在try-catch块中处理异常,执行也会中断; 这也不是我想要的.如果我没记错的话,在这个对话框中有一个名为"未处理的异常"的列或者类似的东西,这会让我感到非常兴奋.但在我的项目中只有一列("Thrown").
我刚刚安装并开始使用VS2012.之前一直在使用VS2008 Express.VS2012在Win 7 64位上运行.(以前的开发环境是在XP 32位上).
到目前为止,已经有一个基础研究项目(WinForms,VB),并发现VS忽略了未处理的异常.最后一行应该导致异常:
With cmd
.Connection = sqlConn
.CommandType = CommandType.StoredProcedure
.CommandText = "NameOfStoredProcedure"
.Parameters.Add("@TheParameterName", SqlDbType.Int, -1)
.Parameters("@TheParameterNameWithATypo").Direction = ParameterDirection.ReturnValue
Run Code Online (Sandbox Code Playgroud)
果然,立即窗口显示:
A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
Run Code Online (Sandbox Code Playgroud)
但代码只是继续运行!
在Debug/Exceptions对话框中,我为每种类型的异常都有一个"Thrown"和"User-Unhandled"复选框.所有人都勾选了"User-Unhandled".我不想勾选"Thrown",因为我将处理异常并且不想中断处理的异常.(现在,我没有尝试...根本没有Catch块 - 但是调试器就好像整个项目都包含在一个中一样).
我已经查看了所有选项等等,但找不到任何魔法"打开Break on Exception"选项.这不是我的代码我正在寻求帮助 - 这就是发生这种情况我不能相信调试器能够发现我不可避免地会犯下的愚蠢错误.
发现另一个问题,有人碰到了这个问题,而Win64似乎存在问题.但VS在Win64上真的无法使用吗?我不能完全相信 - 但不能有效地打破未处理的异常使其无法使用.
编辑: 感谢您的所有意见.我尝试过Neolisk的解决方案,但由于两个处理程序的签名不同,因此必须稍微更改代码:
Public Sub Main()
AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
Form1.Show()
End Sub
Friend Sub ThreadExceptionHandler(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
End Sub
Friend …Run Code Online (Sandbox Code Playgroud)