2017-11-20 3 views
0

Ich möchte alle Fehler an einer Stelle behandeln, ohne diese Klasse zu verweisen.Override-Exception-Klasse und Handle-Fehler ohne Klassenreferenz

sehe meine aktuelle Struktur.

und meine Fehlerbehandlungsklasse.

public class LogEroor : Exception 
{ 
    public LogEroor(string message, Exception Ex) : base(message, Ex) 
    { 
     // error handling 
    } 
} 

Meine Frage

Gibt es eine Möglichkeit, die ich LogError Methode mit Ex Parameter aufrufen kann, wenn Fehler auftritt, aber ich will nicht zu Aufruf dieser Methode in jedem Fang, wie ich hier drüben.

+1

Wie erwarten Sie, eine Methode oder sogar einen Konstruktor aufzurufen, ohne es zu spezifizieren? Was du willst, macht überhaupt keinen Sinn. Natürlich müssen alle deine Klassen auf die generische Exception-Klasse verweisen, wenn sie * einen * werfen. Hpwever können Sie auf die ['AppDomain.UnhandledExceptionHandler'] registrieren (https://msdn.microsoft.com/library/system.appdomain.unhandledexception (v = vs.110) .aspx) – HimBromBeere

Antwort

4

Dies ist eine typische XY problem. Das eigentliche Problem X, das Sie versuchen zu lösen, ist, paraphrasiert:

Ich möchte alle Ausnahmen, die in meiner Webanwendung auftreten, protokollieren.

Ihre Lösung Y, paraphrasiert:

ich von Exception erben werden, in dem ich die Protokollierung tun, und jede Ausnahme wollen, die meine Ausnahmetyp konvertiert werden geworfen wird, so kann es protokolliert werden, ohne einen try-catch-Block an allen Stellen zu schreiben, an denen Ausnahmen auftreten können.

Jetzt wollen Sie Hilfe mit Problem Y, aber das ist der falsche Ansatz insgesamt. Sie könnten es mit der AppDomain.UnhandledException event tun, aber Sie sollten nicht.

Ihre Lösung ist in How do I log ALL exceptions globally for a C# MVC4 WebAPI app?: Verwenden Sie Ausnahmefilter.

1

Wie erwarten Sie, eine Methode oder sogar einen Konstruktor aufzurufen, ohne es zu spezifizieren? Was Sie wollen, ergibt überhaupt keinen Sinn, natürlich müssen alle Ihre Klassen auf die generische Exception-Klasse verweisen, wenn sie bis zu throw sind.

Sie könnten sich an der AppDomain.UnhandledExceptionHandler jedoch registrieren, die eine generische Handler für alle nicht behandelten Ausnahmen ist. Anstatt also alle Ausnahmen zu fangen und sie wieder durch werfen whrapping ihnen können Sie verwenden:

AppDomain.UnhandledExceptionHandler += (sender, args) => { throw new LogError(args.ExceptionObject); }; 

Aber auf diese Weise eine Ausnahme innerhalb der letzten Schicht werfen würde Ausnahmebehandlung Ihre Anwendung hat. Das bedeutet, dass Sie eine Ausnahme auslösen, die nie abgefangen wird und Ihre App zum Absturz bringt. Um dies zu vermeiden, implementieren Sie Ihre Protokollierung direkt in diesem Ereignis.

+0

ok, hab es, danke .. – Bharat

Verwandte Themen