c#未处理的异常处理程序,试图写入日志文件

本文关键字:日志 文件 未处理 异常处理程序 | 更新日期: 2023-09-27 17:50:44

我的应用程序是一个Windows Forms . net 4 c# TCP/IP服务器。它已经崩溃大约每天一次与通用的Windows服务器崩溃消息(按关闭关闭此应用程序)。我插入了以下代码来捕获可能导致这种情况的任何异常,并且我将一个简单的null对象插入到一个例行调用以生成测试异常的例程中。

两件事:

  1. 当测试异常发生时,在调试器中命中日志代码,创建并写入文件,一切正常。
  2. 没有调试器,我得到一个"继续或退出". 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();
        }
    }
}

c#未处理的异常处理程序,试图写入日志文件

您需要应用程序。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块会损坏你的程序。这会自动写入事件日志。