无法访问Sub-Main时捕获VB.NET中的ThreadingException

无法访问Sub-Main时捕获VB.NET中的ThreadingException,.net,vb.net,exception-handling,.net,Vb.net,Exception Handling,我有一个VB.NET winforms解决方案,希望添加标准的应用程序异常处理程序-application.ThreadException和AppDomain.CurrentDomain.UnhandledException 我有以下代码 “启动应用程序。” _ 公共共享子主目录() '将用于处理UI线程异常的事件处理程序添加到事件中。' AddHandler Application.ThreadException,ErrorHandlerForm.Form1\u UIThreadExcepti

我有一个VB.NET winforms解决方案,希望添加标准的应用程序异常处理程序-
application.ThreadException
AppDomain.CurrentDomain.UnhandledException

我有以下代码

“启动应用程序。”
_
公共共享子主目录()
'将用于处理UI线程异常的事件处理程序添加到事件中。'
AddHandler Application.ThreadException,ErrorHandlerForm.Form1\u UIThreadException的地址
'将未处理的异常模式设置为强制执行所有Windows窗体错误'
“我们的经纪人。”
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
'将用于处理非UI线程异常的事件处理程序添加到事件中。'
AddHandler AppDomain.CurrentDomain.UnhandledException,CurrentDomain的地址\u UnhandledException
“运行应用程序。”
Application.Run(新的ErrorHandlerForm())
端接头
当我没有访问
Sub Main()
方法的权限时,如何在VB.NET中执行此操作

如果启用了“我的解决方案”属性的“启用应用程序框架”(
Sub-Main
被隐藏).

您可以截取以添加在加载任何表单之前需要运行的代码

请注意,启动事件处理程序的代码存储在ApplicationEvents.vb文件中,默认情况下该文件是隐藏的


编辑:为了回答您的评论,My.Application和System.Windows.Forms.Application之间存在混淆。如果您在.Application前面加上System.Windows.Forms前缀,它会工作的-我刚刚测试过这个。

我知道您的问题,我想-您的代码文件开头似乎缺少一条
Imports
语句。您可以添加所需的
导入
或完全限定您正在访问的类型:

Imports System
Imports System.Windows.Forms

Public Shared Sub MyApplicationInitialization()
    AddHandler System.Windows.Forms.Application.ThreadException, AddressOf MyThreadExceptionHandler

    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)

    AddHandler System.AppDomain.CurrentDomain.UnhandledException, AddressOf MyUnhandledExceptionHandler
End Sub
从中可以看出,
AppDomain
位于
System
命名空间中,
Application
位于
System.Windows.Forms
命名空间中

请注意,您还需要定义自己的事件处理方法,以便在每个
地址之后指定。这些可按如下方式布置:

Sub MyUnhandledExceptionHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
    'your logic here
End Sub

Sub MyThreadExceptionHandler(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
    'your logic here
End Sub

将前三行代码复制到您确实有权访问的第一个方法调用中。这里将有一个应急的小窗口,但你赢了一些,你输了一些。@失望先生:看到与RoadWarrior bellow相同的评论…
应用程序。ThreadException在该上下文中不存在。meybe对于未处理的,需要处理我。UnhandledException。。。但不确定它是否也适用于ThreadException…可能对于未处理的,需要处理我。未处理的Exception。。。但不确定它是否也适用于ThreadException…如果使用显式名称空间,则无需使用导入。这真的很简单而且有效。从另一方面来说,也许我甚至不需要它,因为ApplicationEvents.vb中有可能执行
私有子应用程序\u未处理的异常(ByVal sender作为对象,ByVal e作为Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventTargets)处理我。UnhandledException
,但我不确定它是否也适用于ThreadException,还是仅适用于未处理的异常…是的,第一行说明有两个选项,完全限定类型名称或使用导入。至于你的处理程序,它们的定义在功能上是不相关的,只要它们可以适当地访问。我认为一件事是使用
AddHandler System.AppDomain.CurrentDomain.UnhandledException
,另一件事是使用
Handles Me.UnhandledException
,因为
Me
System.AppDomain.CurrentDomain
是不同的东西,我相信,你的回答也没有揭示,你的sub应该在哪里使用……我的
sub
应该通过使用
AddHandler
将执行委托给他们,如代码片段中所示。使用它们处理异常的方式完全取决于您。至于使用
Me.UnhandledException
,它们应该等同于同一件事——异常冒泡到并通过这一点,直到应用程序级别。
Sub MyUnhandledExceptionHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
    'your logic here
End Sub

Sub MyThreadExceptionHandler(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
    'your logic here
End Sub