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

标签 c# .net logging exception

我的应用程序是一个 Windows Forms .NET 4 C# TCP/IP 服务器。它每天大约崩溃一次,并显示一条通用的 Windows Server 崩溃消息(按关闭关闭此应用程序)。我插入了以下代码以捕获可能导致此问题的任何异常,并将一个简单的空对象插入到一个例程中,该例程会定期调用以生成测试异常。

两件事:

  1. 当发生测试异常时,在调试器中命中日志代码,创建并写入文件,一切正常。
  2. 如果没有调试器,我会收到“继续或退出”.NET 堆栈跟踪消息,无论我选择哪个,都不会创建或写入文件。

.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();
        }
    }
}

最佳答案

你想要 Application.ThreadException事件。

AppDomain 未处理的异常事件捕获未处理的异常抛出 - 例如 Main 方法抛出的任何异常,但是 Application.Run 在内部处理异常 - 这意味着 Application.Run 不会因事件处理程序中的异常而引发异常,因此永远不会运行 CatchUnhandledException

这意味着如果 ThreadException 处理程序能够从异常中恢复,应用程序将继续正常运行(如果异常是由 Application.Run 抛出的,那么没有恢复的机会)。 由于我不明白的原因,这种行为在调试时是不同的。。调试时会更改此行为,以便抛出异常,从而允许您立即在 Visual Studio 中调试异常 - 这就是未处理的异常处理程序在调试时工作的原因。

请注意,上面的 CatchUnhandledException 处理程序捕获由您的应用程序域中的后台线程抛出的异常。

另见 Application.SetUnhandledExceptionMode .

关于C# 未处理的异常处理程序,试图写入日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5710148/

相关文章:

c# - 获取枚举的描述并将其用作 MVC 中下拉列表的文本属性?

c# - 随时间旋转游戏对象

c# - 尝试将 Quartz.NET 与 oWin 一起使用时出现 Quartz.Simpl.JsonObjectSerializer 错误

参数中带有函数的 Python 日志记录开销

java - 套接字写入与磁盘写入的性能

mysql - 我应该使用 mysql 来保存日志,还是只转储到文本文件

c# - 如何仅将大型 xml 文件的一部分反序列化为 C# 类?

c# - Json.NET可以创建可读的json文件吗?

.net - 为什么这个 WPF 窗口没有调整其大小为 SizeToContent ="WidthAndHeight"的内容?

c# - 如何从 ListView 中获取 ID key - C# Windows 应用程序