2012-04-25 116 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