正在处理windows服务中的AppDomain.CurrentDomain.UnhandledException

本文关键字:AppDomain CurrentDomain UnhandledException 服务 处理 windows | 更新日期: 2023-09-27 17:58:42

我有一个作为同步软件的窗口服务。我想在我的服务上添加未处理的异常日志,所以我修改了我的program.cs,如下所示:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
    static void Main()
    {
        // Register Unhandled Exception Handler
        AppDomain.CurrentDomain.UnhandledException +=
            new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
        // Run Service
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service() 
        };
        ServiceBase.Run(ServicesToRun);
    }
    static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args)
    {
        // Get Exception
        Exception ex = (Exception)args.ExceptionObject;
        // Generate Error
        string ErrorMessage = String.Format(
            "Error: {0}'r'n" +
            "Runtime Terminating: {1}'r'n----- ----- ----- ----- ----- -----'r'n'r'n" +
            "{2}'r'n'r'n####################################'r'n",
                ex.Message,
                args.IsTerminating,
                ex.StackTrace.Trim());
        // Write Error To File
        try
        {
            using (StreamWriter sw = File.AppendText("UnhandledExceptions.log"))
                sw.WriteLine(errorMessage);
        }
        catch { }
    }
}

然后,在我的Service.cs文件中,在OnStart方法中,我添加了一个throw new Exception("test");,以查看未处理的异常是否按预期记录到文件中。

当我启动服务时,它会按预期立即停止;但是,它似乎没有将异常记录到指定的文件中。

知道我在这里做错了什么吗?提前感谢您的帮助。

在您询问之前,我的服务以Local Service运行,并且我的service.exe运行的目录(c:''mysync)已经在安全选项卡中添加了Local Service,并具有完全的读/写访问权限

正在处理windows服务中的AppDomain.CurrentDomain.UnhandledException

OnStart在try-catch块内的Service基类中调用。如果在这个阶段发生异常,它会捕获它,并因此设置状态1,不要再抛出它:

  string[] args = (string[]) state;
  try
  {
    this.OnStart(args);
    .....
  }
  catch (Exception ex)
  {
    this.WriteEventLogEntry(Res.GetString("StartFailed", new object[1]
    {
      (object) ((object) ex).ToString()
    }), EventLogEntryType.Error);
    this.status.currentState = 1;
  }

因此,您可以在EventLogs中找到一条记录,但无法将其作为未处理的域异常捕获,因为没有此类异常。

   using (StreamWriter sw = File.AppendText("UnhandledExceptions.log"))

不使用文件的完整路径名(如c:''foo''bar.log)永远是一个非常的坏主意。尤其是在服务中,您对服务的默认目录几乎没有控制权。因为它是由服务控制管理器启动的,而不是由用户从命令提示符或桌面快捷方式启动的。

很有可能你只是看错了文件。真正的可能最终被写入c:''windows''system32(或syswow64)。操作系统目录通常是写保护的,但这对服务不起作用,它们使用高度特权的帐户运行,因此可能会将硬盘丢弃在任何地方。

始终使用完整路径名。强烈建议使用EventLog。