c#未处理的异常处理程序,试图写入日志文件
本文关键字:日志 文件 未处理 异常处理程序 | 更新日期: 2023-09-27 17:50:44
我的应用程序是一个Windows Forms . net 4 c# TCP/IP服务器。它已经崩溃大约每天一次与通用的Windows服务器崩溃消息(按关闭关闭此应用程序)。我插入了以下代码来捕获可能导致这种情况的任何异常,并且我将一个简单的null对象插入到一个例行调用以生成测试异常的例程中。
两件事:
- 当测试异常发生时,在调试器中命中日志代码,创建并写入文件,一切正常。
- 没有调试器,我得到一个"继续或退出". net stacktrace消息,无论我选择哪个,文件都不会创建或写入。
. net消息对我来说是无用的。我需要崩溃的日志文件堆栈跟踪。有人知道我该怎么做吗?谢谢。
static class Program
{
[STAThread]
static void Main(string[] rgszArgs)
{
//My exception handler
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CatchUnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain(rgszArgs));
}
static void CatchUnhandledException
(object sender, UnhandledExceptionEventArgs e)
{
StreamWriter sw;
DateTime dtLogFileCreated = DateTime.Now;
Exception ex;
try
{
sw = new StreamWriter("crash-" + dtLogFileCreated.Day + dtLogFileCreated.Month
+ dtLogFileCreated.Year + "-" + dtLogFileCreated.Second
+ dtLogFileCreated.Minute + dtLogFileCreated.Hour + ".txt");
ex = (Exception)e.ExceptionObject;
sw.WriteLine("### Server Crash ###");
sw.WriteLine(ex.Message + ex.StackTrace);
sw.Close();
}
finally
{
Application.Exit();
}
}
}
您需要应用程序。ThreadException事件。
AppDomain未处理异常事件捕获抛出的未处理异常-例如Main
方法抛出的任何异常,然而Application.Run
内部处理异常-这意味着Application.Run
不会抛出异常作为事件处理程序中异常的结果,因此CatchUnhandledException
永远不会运行。
这意味着如果ThreadException
处理程序能够从异常中恢复,应用程序将继续正常运行(如果异常是由Application.Run
抛出的,则没有恢复的机会)。由于我不理解的原因,在调试时这种行为是不同的。当调试此行为时,将其更改为抛出异常,从而允许您立即在Visual Studio中调试异常-这就是为什么在调试时未处理的异常处理程序正在工作。
注意,上面的CatchUnhandledException
处理程序将捕获应用程序域中后台线程抛出的异常。
参见Application.SetUnhandledExceptionMode
我不得不猜测这是AppDomain的事件处理程序。UnhandledException事件。有一件事你绝对不能做,那就是调用Application.Exit(),程序不再处于正确的关闭状态,你必须调用Environment.Exit()。Application.Exit()调用可能是"继续或退出"消息的来源,这听起来像Winforms应用程序在UI线程中遭受攻击时显示的ThreadExceptionDialog。
下一个问题是传递给StreamWriter构造函数的参数。您没有为文件指定完整的路径名(如c:'mumble'foo.txt),它可能会尝试将文件写入您没有写访问权限的目录。很可能在Vista或Win7上。或者文件确实被写入了,但你只是找不到它,因为你不知道去哪里找。
使用Environment.GetFolderPath()选择一个您知道可以写入的目录
这是来自MSDN上的AppDomain。UnhandledException事件:
从。net Framework版本4开始,除非事件处理程序具有HandleProcessCorruptedStateExceptionsAttribute属性,否则不会为破坏进程状态的异常(例如堆栈溢出或访问违规)引发此事件。
会是这个吗?
你也可以尝试调用Environment.FailFast("reason for failure here"
),如果你的程序的状态是如此混乱,任何代码在一个try/finally块会损坏你的程序。这会自动写入事件日志。