2008-09-18 4 views
1

Je suis en train de modifier une application WinForms existante qui est configurée avec un TraceListener personnalisé qui enregistre les erreurs non gérées qui se produisent dans l'application. Il me semble que le TraceListener reçoit le message faisant partie de l'exception (qui est ce qui est enregistré), mais pas les autres informations d'exception. J'aimerais pouvoir accéder à l'objet d'exception (pour obtenir la pile et d'autres infos).Comment puis-je obtenir l'exception actuelle dans un WinForms TraceListener

Dans ASP.NET, que je connais plus, j'appellerais Server.GetLastError pour obtenir l'exception la plus récente, mais bien sûr cela ne fonctionnera pas dans WinForms. Comment obtenir l'exception la plus récente?

Répondre

3

Je suppose que vous avez défini un gestionnaire d'événements qui intercepte les exceptions de domaine non gérées et les exceptions de threads. Dans ce délégué, vous appelez probablement l'écouteur de trace pour consigner l'exception. Il suffit d'émettre un appel supplémentaire pour définir le contexte d'exception.

[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 { ... } } 
} 

Sur les méthodes Write dans MyTraceListener, vous pouvez obtenir le contexte d'exception et travailler avec. N'oubliez pas de synchroniser le contexte d'exception.

Questions connexes