代码之家  ›  专栏  ›  技术社区  ›  PaulStock

如何在WinForms TraceListener中获取当前异常

  •  1
  • PaulStock  · 技术社区  · 16 年前

    我正在修改一个现有的WinForms应用程序,该应用程序使用一个自定义的TraceListener进行设置,它记录应用程序中发生的任何未处理的错误。在我看来,traceListener获取异常的消息部分(这是记录的内容),但不获取其他异常信息。我希望能够获取异常对象(以获取stacktrace和其他信息)。

    在我更熟悉的ASP.NET中,我会调用Server.GetLastError来获取最新的异常,但当然这在WinForms中不起作用。

    如何获取最近的异常?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Jorge Ferreira    16 年前

    我假设您设置了一个事件处理程序来捕获未处理的域异常和线程异常。在该委托中,您可能调用跟踪侦听器来记录异常。只需发出一个额外的调用来设置异常上下文。

    [STAThread]
    private static void Main()
    {
        // Add the event handler for handling UI thread exceptions
        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        // Add the event handler for handling non-UI thread exceptions
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        ...
        Application.Run(new Form1());
    }
    
    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        MyTraceListener.Instance.ExceptionContext = e;
        Trace.WriteLine(e.ToString());
    }
    
    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        // similar to above CurrentDomain_UnhandledException
    }
    
    ...
    
    Trace.Listeners.Add(MyTraceListener.Instance);
    
    ...
    
    class MyTraceListener : System.Diagnostics.TraceListener
    {
        ...
        public Object ExceptionContext { get; set; }
        public static MyTraceListener Instance { get { ... } }
    }
    

    在MyTraceListener中的写入方法上,您可以获取异常上下文并使用它。请记住同步异常上下文。