2012-04-25 75 views
4

我把try/catch块放在偶尔会引发预期异常的代码中,而不是捕获它并显示消息框,它会停止调试器并警告我该异常未处理。为什么try/catch没有捕获访问冲突?

如何处理此异常,以便在发生异常时不会停止代码?

enter image description here

Friend myDevInfo As New devInfo 

     ''' <summary> 
     ''' Closes the device handle obtained with CreateFile and frees resources. 
     ''' </summary> 
     ''' 
     Friend Sub CloseDeviceHandle() 

      Try 
       WinUsb_Free(myDevInfo.winUsbHandle) 

       If Not (myDevInfo.deviceHandle Is Nothing) Then 
        If Not (myDevInfo.deviceHandle.IsInvalid) Then 
         myDevInfo.deviceHandle.Close() 
        End If 
       End If 

      Catch ex As System.AccessViolationException 
       MsgBox("System.AccessViolationException") 
      Catch ex As Exception 
       Throw 
      End Try 

     End Sub 
+0

你已经调试 - >例外配置为停止对异常? – 2012-04-25 08:52:44

+0

我相信默认设置是打破'AccessViolationException' – Xharze 2012-04-25 08:54:07

+2

你不应该试图捕捉'AccessViolationException'。你应该修复造成它的错误。这个例外不应该被期望。 – CodesInChaos 2012-04-25 08:58:58

回答

3

try...catch块应该按预期,当没有附加调试器。
你可以在调试 - >例外情况下定义调试器打破的异常,我相信默认是打破AccessViolationException

+0

嗯,我没有在'Debug' - >'Options and Settings ...'中看到这个选项吗?'你能给我一个线索在哪里看? – 2012-04-25 08:56:17

+0

另外,有没有一种方法可以在IDE中执行项目而无需调用调试器,所以我可以测试这个呢? – 2012-04-25 08:57:00

+0

您使用的是哪个版本的Visual Studio?它应该在'Debug' - >'Exceptions ...'中,而不是在'Options and Settings'中。 – Xharze 2012-04-25 08:59:23

1

访问冲突异常属于一类名为“损坏的状态异常”的异常。随着.Net 4,微软决定不应该再试图抓住这些catch块。他们的推理是需要理解和关心从损坏的状态异常中恢复而不会造成更多的损害,并且如果应用程序被关闭,则对用户的数据更安全。

MSDN会告诉你how to reverse this change