为什么try / catch没有捕获访问冲突?

时间:2012-04-25 08:49:48

标签: .net vb.net exception exception-handling

我在一些代码中放置了一个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

3 个答案:

答案 0 :(得分:3)

当没有连接调试器时,try...catch块应该按预期工作 您可以在Debug - &gt;下定义调试器中断的异常。例外情况,我认为默认是在AccessViolationException打破。

答案 1 :(得分:1)

访问冲突异常属于一类称为“损坏的状态异常”的异常。使用.Net 4,微软决定不再通过try .. catch块捕获这些内容。他们的理由是,如果应用程序关闭,它需要理解并注意从损坏的状态异常中恢复而不会造成更多损害,并且对于用户数据更安全。

MSDN会告诉您how to reverse this change

答案 2 :(得分:1)

在正在使用的函数顶部使用此属性。

 [HandleProcessCorruptedStateExceptions()]

只有不安全或受保护的内存才会发生此异常。未分配的内存。如果使用此属性,则clr将检测到该属性,并且try-catch块在以下位置正常运行:

System.Runtime.ExceptionServices;