2014-03-13 7 views
7

Ich habe eine Klasse wie:Wie alle Ausnahmen auf Klassenebene in CSharp zu fangen?

class SampleRepositoryClass 
{ 
    void MethodA() 
    { 
     try 
     { 
      //do something 
     } 
     catch(Exception ex) 
     { 
      LogError(ex); 
      throw ex; 
     }   
    } 

    void MethodB(int a, int b) 
    { 
     try 
     { 
      //do something 
     } 
     catch(Exception ex) 
     { 
      LogError(ex); 
      throw ex; 
     } 
    } 

    List<int> MethodC(int userId) 
    { 
     try 
     { 
      //do something 
     } 
     catch(Exception ex) 
     { 
      LogError(ex); 
      throw ex; 
     } 
    } 
} 

In obigem Beispiel können Sie, dass in der einzelnen Methoden (siehe MethodA, MethodB, MethodC) haben versuchen ... catch-Blöcke, die Fehler zu protokollieren und dann zu einem höheren Ebene werfen .

Stellen Sie sich vor, wenn meine Repository-Klasse mehr als hundert Methoden haben und in jeder Methode habe ich versuchen ... catch Block, auch wenn es nur einzelne Zeile des Codes.

Jetzt ist meine Absicht, diese repetitive Ausnahme Logging-Code zu reduzieren und alle Ausnahmen auf Klassenebene statt auf Methodenebene zu protokollieren.

+2

Nur [aspektorientierte Programmierung] (http://en.wikipedia.org/wiki/Aspekt-orientierte_Programmierung) Werkzeuge/Weber [wie PostSharp] (http://www.postsharp.net/) könnten Ihnen helfen. Übrigens, mehr als hundert Methoden in einer Klasse? Das ist nur ... * Schlecht *. Zumindest aus meiner Sicht. Und auf jeden Fall unheimlich. –

+0

Das stimmt, aber meine Business- und Repository-Klassen haben viele Methoden, die diese Klassen zu schwer machen. Tatsächlich hängt die Anzahl der Methoden in einer Klasse von der Komplexität der Geschäftsregeln oder der Anzahl der Operationen ab, die Sie ausführen möchten. – Haidar

+2

Verwenden Sie nicht "werfen ex;" denn das wird deinen wertvollen Call-Stack zerstören. Schreib einfach "werfen". und die Informationen in der Ausnahme bleiben erhalten. Damit möchte ich darauf hinweisen, dass Sie keine Ausnahmen abfangen sollten, wenn Sie nicht wissen, wie Sie damit umgehen sollen. Referenz: http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex –

Antwort

1

Sie sind zu defensiv. Überbeanspruchen Sie nicht try..catch nur dort, wo Sie benötigen es.

In diesem Fall erwägen Sie das Abfangen von Ausnahmen, die durch Interaktion mit Ihrer Klasse außerhalb Ihrer Klasse ausgelöst wurden. Beachten Sie, dass Ausnahmen fortgeschrieben werden.

1

Verwenden Sie Bibliotheken wie Policy Injection Application Block, Castle, Spring.NET usw. Diese Bibliotheken ermöglichen es Ihnen, Verhalten als Exception Catching zu injizieren.

+0

Könnten Sie bitte Beispielcode freigeben, ohne eine andere Bibliothek zu verwenden (Policy Injection Application Block, Castle oder Spring.NET)? – Haidar

+0

Leider implementieren diese Bibliotheken Proxy Design Patterns und beschäftigen sich mit vielen Reflektionen etc. Wenn ich diese Installation überspringe, muss ich sehr viel Code schreiben ... –

0

implementieren Nur DispatcherUnhandledException in Sie App.xaml.cs; Es wird alle Ihre Ausnahmen behandeln;

public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      DispatcherUnhandledException += App_DispatcherUnhandledException; 
     } 
     void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
     { 
      LogError(e); 
// MessageBox.Show(e.Exception.Message); 
      e.Handled = true; 
     } 
+0

Entschuldigung, ich möchte es in der Klassenbibliothek von BAL oder DAL durchführen. – Haidar

5

Warum neu erfinden das Rad, wenn es so etwas wie FREE Beitrag Sharp Express ist. Es ist so einfach wie das Hinzufügen der PostSharp.dll als Referenz zu Ihrem Projekt. Danach tun, Ihr Repository wie folgt aussehen würde:

[Serializable] 
class ExceptionWrapper : OnExceptionAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     LogError(args.Exception); 
     //throw args.Exception; 
    } 
} 

[ExceptionWrapper] 
class SampleRepositoryClass 
{ 
    public void MethodA() 
    { 
     //Do Something 
    } 

    void MethodB(int a, int b) 
    { 
     //Do Something 
    } 

    List<int> MethodC(int userId) 
    { 
     //Do Something 
    } 
} 

Hinzufügen des ExceptionWrapper Attribut auf die Klasse, sorgt für alle Eigenschaften und Methoden sind in einem try/catch-Block gekapselt. Der Code in Catch ist der Code, den Sie in ExceptionWrapper in die Überschreibungsfunktion OnException() schreiben.

Sie müssen Code nicht erneut schreiben, um zu wiederholen. Die Ausnahme kann auch automatisch erneut ausgelöst werden, wenn das richtige Flow-Verhalten bereitgestellt wird. Bitte überprüfen Sie die Dokumentation dafür.

Verwandte Themen