无法访问Sub-Main时捕获VB.NET中的ThreadingException
我有一个VB.NET winforms解决方案,希望添加标准的应用程序异常处理程序-无法访问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
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