【问题标题】:Global uncaught exception handler全局未捕获异常处理程序
【发布时间】:2018-06-14 23:07:46
【问题描述】:

我有一个带有一些 DLL 扩展的程序,它们在运行时加载。前端是 WinForms 中的 CefSharp。但是该程序已经那么大了,使用了其他一些第 3 方代码部分(我无法处理)并且该程序必须在没有永久维护的情况下在遥远的客户商店运行,我需要一个全局异常处理程序对于未捕获的异常,处理这些异常并记录它们,以供分析。

我已经真正搜索过解决方案和教程,但没有什么对我有用。

主窗体只是启动另一个程序集(并给他表单对象),并且这个程序集“完成了它的事情”。例如将 CefSharp-Browser 添加到表单中。

我尝试在 ApplicationEvents.vb 中添加处理Handles Me.UnhandledException, MyBase.UnhandledException, MyClass.UnhandledException 的方法

Namespace My     

    Partial Friend Class MyApplication

        Protected Overrides Function OnInitialize(ByVal commandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean

            Me.MinimumSplashScreenDisplayTime = 0

            AddHandler My.Application.UnhandledException, AddressOf UnhandledExceptionHandler

            Return MyBase.OnInitialize(commandLineArgs)

        End Function


        Public Sub UnhandledExceptionHandler(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException, MyBase.UnhandledException, MyClass.UnhandledException

            Dim errstr = $"Message: {vbNewLine}
                      {e.Exception.Message}{vbNewLine}
                      {vbNewLine}
                      InnerMessage: {vbNewLine}
                      {e.Exception.InnerException.Message}{vbNewLine}
                      {vbNewLine}
                      Stacktrace: {vbNewLine}
                      {e.Exception.StackTrace.ToString()}{vbNewLine}"
            MsgBox($"Aa uncaught exception was thrwon! {vbNewLine} {vbNewLine} {errstr}")

        End Sub

    End Class

End Namespace

但是这个方法 UnhandledExceptionHandler 永远不会被调用,即使抛出的异常在调试器中被标记为未捕获并导致调试暂停。

所以如果我的问题不清楚:任何人都可以帮助我或可以向我解释,我在哪里犯了错误,我可能在哪里做出了错误的假设或者这样一个未捕获的异常处理程序将如何工作。

在 Visual Studio 2017 的 vb.net 中

【问题讨论】:

  • 直接运行应用程序,即不在调试器中,看看当异常被抛出并且没有在其他地方捕获时会发生什么。
  • 程序没有崩溃,但也没有给我关于未捕获异常的信息(是的,有一个,我已经处理好了)
  • 异常到底是在哪里抛出的?如果它在表单的Load 事件处理程序中,那么这就是您没有看到它的原因。此类异常在 64 位系统上会被吞没。如果您想了解原因,可以搜索。
  • 重点是在加载的扩展中的任何地方都可能导致异常。当我知道异常发生在哪里时,我会在这个地方处理它以实现适当的异常处理。但问题是关于未知的例外,例如由第 3 方代码或损坏的设置配置等​​引发的异常。
  • 但是我看到了:异常被调试器捕获。被调用函数由 CefSharp 浏览器通过 Javascript 调用。但是继续之后,CefSharp 浏览器的 devTools 窗口中出现了一个错误……在调试器已经捕获到异常之后。这对我来说似乎不合逻辑,调试器暂停程序,而异常似乎被 Cef 捕获。

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


【解决方案1】:

这就是我刚才所做的,以证明它可以正常工作:

  1. 创建一个新的 WinForms 项目。
  2. Button 添加到表单并处理其Click 事件。
  3. 将代码添加到将引发异常的事件处理程序,例如IO.File.OpenRead("this file does not exist")
  4. 打开项目属性的应用程序页面,然后单击“查看应用程序事件”按钮。
  5. 在代码窗口顶部的中间下拉菜单中选择“(MyApplication Events)”,然后在最右侧的下拉菜单中选择 UnhandledException。
  6. 向事件处理程序添加一些通知代码,例如MessageBox.Show(e.Exception.ToString())
  7. 按 F5 在调试器中运行项目并单击Button。请注意,调试器会通知您该异常。
  8. 按 Ctrl+F5 在不调试的情况下运行应用程序,然后单击Button。请注意,您的通知代码已执行。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多