【发布时间】: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