【问题标题】:Why isn't the try/catch catching the access violation?为什么 try/catch 没有捕获访问冲突?
【发布时间】:2012-05-05 22:31:57
【问题描述】:

我在一些偶尔抛出预期异常的代码周围放置了一个 try/catch 块,但它没有捕获它并显示消息框,而是停止调试器并提醒我该异常未处理。

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

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

【问题讨论】:

  • 您是否已将 Debug -> Exceptions 配置为在出现异常时停止?
  • 我相信默认设置是在AccessViolationException上中断
  • 您不应该尝试捕捉AccessViolationException。您应该修复导致它的错误。永远不应出现此异常。
  • 按 F5 即可到达 catch 块。
  • @CodeInChaos 就是,一般来说,是的。

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


【解决方案1】:

当没有附加调试器时,try...catch 块应该按预期工作。
您可以在 Debug -> Exceptions 下定义调试器中断的异常,我相信默认是在 AccessViolationException 上中断。

【讨论】:

  • 嗯,我在Debug 中没有看到那个选项 --> Options and Settings... 你能告诉我在哪里看吗?
  • 另外,有没有办法在 IDE 中执行项目而不调用调试器,这样我就可以测试了?
  • 您使用的是哪个版本的 Visual Studio?它应该在Debug -> Exceptions...,而不是Options and Settings
  • 如果您使用的是 Visual Studio,您可以使用 Debug -> Start without DebuggingCTRL+F5(默认快捷方式)在不附加调试器的情况下运行它。
  • 您可以通过按 Ctrl + Alt + E 来更改调试器中断的异常
【解决方案2】:

访问冲突异常属于称为“损坏状态异常”的异常类别。在 .Net 4 中,Microsoft 决定不再使用 try .. catch 块来捕获这些内容。他们的理由是,在不造成更多损害的情况下,从损坏的状态异常中恢复需要理解和小心,并且如果应用程序关闭,用户的数据会更安全。

MSDN 会告诉你how to reverse this change

【讨论】:

    【解决方案3】:

    在你正在使用的函数的顶部使用这个属性。

     [HandleProcessCorruptedStateExceptions()]
    

    只有不安全或受保护的内存才会发生此异常。未分配的内存。如果您使用此属性,则 clr 将检测到它,并且 try-catch 块工作正常:

    System.Runtime.ExceptionServices;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多