正在处理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
,并具有完全的读/写访问权限
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。