关于.net Windows服务中的vb.net:UnhandledException处理程序

关于.net Windows服务中的vb.net:UnhandledException处理程序

UnhandledException handler in a .Net Windows Service

是否可以在Windows服务中使用UnhandledException处理程序?

通常,我会使用自定义构建的异常处理组件来进行日志记录,电话回家等。该组件向System.AppDomain.CurrentDomain.UnhandledException添加了一个处理函数,但据我所知,它无法获得Windows Service的支持,因此 我最终在我的2(或4)个服务入口点中使用了这种模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<wyn>
    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.
        Try
            MyServiceComponent.Start()
        Catch ex As Exception
            'call into our exception handler
            MyExceptionHandlingComponent.ManuallyHandleException (ex)
            'zero is the default ExitCode for a successfull exit, so if we set it to non-zero
            ExitCode = -1
            'So, we use Environment.Exit, it seems to be the most appropriate thing to use
            'we pass an exit code here as well, just in case.
            System.Environment.Exit(-1)
        End Try
    End Sub
</wyn>

我的自定义异常处理组件是否可以更好地处理此问题,因此我不必用凌乱的异常处理管道填充OnStart?


好的,我现在对此进行了更多研究。
在.Net中创建Windows服务时,会创建一个从System.ServiceProcess.ServiceBase继承的类(在VB中,该类隐藏在.Designer.vb文件中)。然后,您可以覆盖OnStart和OnStop函数,以及OnPause和OnContinue(如果选择)。
这些方法是从基类中调用的,因此我对反射器做了一些探索。
OnStart由System.ServiceProcess.ServiceBase中的一个称为ServiceQueuedMainCallback的方法调用。我的机器" System.ServiceProcess,版本= 2.0.0.0"上的版本反编译如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<wyn>
Private Sub ServiceQueuedMainCallback(ByVal state As Object)
    Dim args As String() = DirectCast(state, String())
    Try
        Me.OnStart(args)
        Me.WriteEventLogEntry(Res.GetString("StartSuccessful"))
        Me.status.checkPoint = 0
        Me.status.waitHint = 0
        Me.status.currentState = 4
    Catch exception As Exception
        Me.WriteEventLogEntry(Res.GetString("StartFailed", New Object() { exception.ToString }), EventLogEntryType.Error)
        Me.status.currentState = 1
    Catch obj1 As Object
        Me.WriteEventLogEntry(Res.GetString("StartFailed", New Object() { String.Empty }), EventLogEntryType.Error)
        Me.status.currentState = 1
    End Try
    Me.startCompletedSignal.Set
End Sub
</wyn>

因此,由于从Try Catch块的Try部分中调用了Me.OnStart(args),因此我假设OnStart方法内发生的任何事情都被该Try Catch块有效地包装了,因此,从技术上讲,发生的任何异常都不会被处理它们实际上是在ServiceQueuedMainCallback尝试捕获中处理的。因此,CurrentDomain.UnhandledException至少在启动例程期间实际上不会发生。
其他三个入口点(OnStop,OnPause和OnContinue)都以类似的方式从基类中调用。

因此,我"想"这说明了为什么我的异常处理组件无法在启动和停止时捕获UnhandledException,但是我不确定这是否解释了为什么在OnStart中设置的计时器在触发时不会导致UnhandledException。


您可以订阅AppDomain.UnhandledException事件。如果有消息循环,则可以绑定到Application.ThreadException事件。


推荐阅读

    linux服务器分区命令?

    linux服务器分区命令?,系统,管理,信息,设备,时间,命令,基础,首次,平均,情况,l

    linux服务器上传命令?

    linux服务器上传命令?,服务,软件,平台,数据,工具,系统,手机,电脑,设备,官网,

    linux重新服务命令?

    linux重新服务命令?,服务,系统,网络,标准,工作,设备,命令,名称,信息,网络服

    linux服务器基本命令?

    linux服务器基本命令?,地址,系统,设备,网络,工作,标准,信息,电脑,命令,密码,l

    linux服务器下载命令?

    linux服务器下载命令?,服务,密码,系统,档案,工具,网络,公共,百度,地址,认证,l

    linux命令怎么停服务?

    linux命令怎么停服务?,服务,系统,状态,代码,跨行,软件,情况,第一,名称,命令,l

    创建自定义命令linux?

    创建自定义命令linux?,工具,状态,命令,系统,代码,标准,数据,位置,电脑,材料,L

    linux自定义命令行?

    linux自定义命令行?,系统,工作,名称,百度,命令,管理,工具,位置,信息,终端,Lin

    linux服务端退出命令?

    linux服务端退出命令?,档案,命令,环境,异常,标准,网络,模式,终端,编辑,文件,l

    linux配置自定义命令?

    linux配置自定义命令?,服务,系统,状态,策略,周期,地方,标准,新增,环境,工具,L

    linux中启动服务命令?

    linux中启动服务命令?,服务,系统,命令,信息,工作,设备,网络,标准,名称,密码,l

    linux服务器常用命令?

    linux服务器常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,设备,功能,

    linux筛选服务命令?

    linux筛选服务命令?,服务,系统,状态,软件,环境,主体,技术,号码,发行,名称,查

    linux服务器保存命令?

    linux服务器保存命令?,时间,状态,档案,电脑,命令,信息,位置,编辑,文件,模式,L

    linux服务器扫盘命令?

    linux服务器扫盘命令?,地址,工作,命令,目录,数据,单位,名称,系统,管理,信息,L

    自定义命令linux命令?

    自定义命令linux命令?,工具,系统,数据,命令,新增,代理,通信,地方,信息,时间,

    linux命令切换服务器?

    linux命令切换服务器?,地址,名称,系统,环境,实时,命令,服务器,脚本,路径,版

    linux自定义简写命令?

    linux自定义简写命令?,系统,工作,命令,标准,地址,基础,信息,软件,目录,文件,

    linux命令简写自定义?

    linux命令简写自定义?,系统,状态,命令,代码,工具,发行,标准,软件,文件,别名,L

    linux服务器搭建命令?

    linux服务器搭建命令?,系统,服务,软件,地址,平台,在线,密码,工具,环境,百度,l