0

Ich verwende das ABP-Framework mit WinForms und ich muss die beste Möglichkeit zum Abfangen einer Ausnahme identifizieren und diese Informationen protokollieren.WinForms Ausnahme Interceptor

Meine WinForms ist eine Multiple-Document Interface (MDI) -Anwendung. Ich füge ein HandleException in Program.cs hinzu, so dass wenn die Anwendung eine Ausnahme auslöst, ich es in der Protokolldatei protokollieren kann. Aber wenn ich eine Ausnahme in einem ApplicationService bekomme, wird diese Ausnahme von ABP behandelt und nicht zu WinForms zurückgeworfen, und nichts wird in der Protokolldatei geschrieben.

Muss ich eine Schnittstelle implementieren, um die klassische Protokollierung wie MVC/Angular App zu haben?

UPDATE

fand ich, dass das Problem auf asynchroner Betrieb zusammenhängt. Normalerweise rufe ich an:

await _service.GetProducts(); 

Wenn eine Ausnahme ausgelöst wird, fängt der Hauptthread es nicht ab. Wenn ich umstelle auf:

AsyncHelper.RunSync(() => _service.GetProducts()); 

Dann fängt der Haupt Thread den Fehler ab.

Antwort

0

Da die Ausnahme in einem anderen Thread ausgelöst wird, müssen Sie unbehandelte Ausnahmen der Anwendungsdomäne behandeln. Fügen Sie den Ausnahmebehandler in den Startpunkt Ihrer Anwendung ein. für Win Formen denke ich Ihnen Asynchron-Code starten Program.cs

static class Program 
{ 
    [STAThread] 
    static void Main(string[] argv) 
    { 
    try 
    { 
     AppDomain.CurrentDomain.UnhandledException += (sender,e) 
     => HandleException(e.ExceptionObject); 

     Application.ThreadException += (sender,e) 
     => HandleException(e.Exception); 


     Application.Run(new MainWindow()); 
    } 
    catch (Exception ex) 
    { 
     HandleException(ex); 
    } 
    } 

    static void HandleException(object exception) { 
    var ex= exception as Exception; 
    if (ex== null) { 
     ex= new NotSupportedException("Unhandled exception: " + exceptionObject.ToString()); 
    } 

    //you can log exception here -> ex.ToString(); 
    } 
} 
+0

@ Albert thk für Ihren Vorschlag, aber auf diese Weise können Sie nicht abfangen async Ausnahme – andmattia

0

Ok nach einiger invastigation und googeln fand ich diese MSDN Erklärung Asynchronous Programming - Async from the Start

accoriding zu diesem Artikel ich mein Programm ändern bewegen verwenden können. Ich brauche ein bisschen mehr chage, weil ich auf MDI Form bin, wenn offen eine innene Form

Form1 childForm = Globals.Bootstrapper.IocManager.Resolve<Form1>(); 
     childForm.MdiParent = this; 
     var formAsync = childForm.InitializeAsync(); 
     FormExtension.HandleExceptions(formAsync); 
     childForm.Show(); 

ich die statische Klasse fügen Sie die Fehlerform Abp abfangen

public static async void HandleExceptions(Task task) 
    { 
     try 
     { 
      await Task.Yield(); //ensure this runs as a continuation 
      await task; 
     } 
     catch (Exception ex) 
     { 
      //deal with exception, either with message box 
      //or delegating to general exception handling logic you may have wired up 
      //e.g. to Application.ThreadException and AppDomain.UnhandledException 
      var log = Globals.Bootstrapper.IocManager.IocContainer.Resolve<ILogger>(); 
      LogHelper.LogException(log, ex); 
      //Exception handling... 
      MessageBox.Show("Ops!" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

      //Application.Exit(); 
     } 
    } 

Nun meine Log-Datei ist in der richtigen Weise bevölkert

+0

dies sieht nicht wie eine bequeme Möglichkeit, das Problem zu erreichen. Wo ist die Überwachung hier? Sie erstellen einfach eine Try-Catch Umgebung um eine Aufgabe herum. Bei einer Überwachung müssen Sie vor oder nach der eigentlichen Funktion etwas tun! –

Verwandte Themen