2017-09-12 5 views
0

Ich habe eine Methode für die Behandlung von Ausnahmen wie folgt. Die Frage ist, dass für den Fall, dass die typeof Ausnahme unser Punkt ist, welcher Ansatz empfohlen wird? Mit
catch (System.Exception ex) when(ex.GetType() ==typeof(ExcOneException)){...}
oder
catch (ExcOneException ex) {...}Verwenden der Ausnahmefilterung in C# 6.0 (mit typeof()) VS. benutzerdefinierte Ausnahme abfangen

public T MyMethod<T>(Func<T> codeToExecute) 
    { 
     try 
     { 
      return codeToExecute.Invoke(); 
     } 
     catch (System.Exception ex) when(ex.GetType() ==typeof(ExcOneException)) 
     { 
      throw new ExcOneException(ex.Message,ex); 
     } 
     catch (System.Exception ex) 
     { 
      throw new ExcTwoException(ex.Message, ex); 
     } 
    } 

UPDATE: Meine Lösung hat drei Projekte, UI, Dienste und Data Access. Jedes Teil hat seine eigene benutzerdefinierte Exception-Handler-Klasse. Stellen Sie sich vor, der betreffende Code befindet sich im Service-Projekt. Alle Codes sollten diese Methode zur Ausführung aufrufen. Wenn ein Laufzeitfehler mit dem Typ von ExcOneException auftritt, bedeutet dies, dass der Fehler im Service-Abschnitt liegt, andernfalls sollte ein Fehler im Datenzugriffsteil auftreten. Daher sollte ExcTwoException ausgelöst werden. Dieser Ansatz hilft mir beim Bubbling-Fehler bis zur UI-Ebene mit Details. Was ich nicht wusste, war, dass, in dem Fall, dass wir C# 6 Eigenschaften verwenden können, wenn ich gerade auf Ausnahmetyp filtern, welcher Ansatz besser ist, Catch-When oder Nennung Ausnahme-Typ als Argument des Catch?

+0

Warum nicht 'catch (System.Exception ab), wenn (ex ist ExcOneException))'? In jedem Fall solltest du 'catch (ExconeException ex) {...}' machen. – Enigmativity

+0

Genau ich möchte wissen, ob es in diesem Fall einen Unterschied in Ausführung und Leistung gibt oder nicht. Ich weiß zum Beispiel, dass die Verwendung von if/else für die Überprüfung des Typs der Ausnahme in body of catch nicht empfohlen wird, weil der Stapel aufgewickelt wird und die Spur verloren geht. Ich möchte jedoch sicher sein, dass zwischen zwei oben genannten Ansätzen kein Unterschied besteht. – Elnaz

+1

Verwenden Sie nicht 'neue ExconeException werfen (ex.Message, ex);' wenn die Exception bereits eine ExcOneException ist. Es erstellt den Stack-Trace neu. Verwenden Sie 'throw;' wie Paulo Morgado empfohlen – Mafii

Antwort

0

Warum würden Sie jemals darüber nachdenken? Sie erwähnen Leistung. Haben Sie Messungen, die Sie verdächtig machen?

Ausnahmefilter gibt es zum Filtern von Ausnahmen, die Sie nicht nach Typ abfangen können, was nicht Ihr Fall ist.

In Ihrem Code werfen Sie auch nicht die gefangene Ausnahme zurück. Sie werfen eine neue Ausnahme mit der abgefangenen Ausnahme als innere Ausnahme, was Sie tun, wenn Sie die abgefangene Ausnahme mit einer sinnvolleren umbrechen möchten.

Wenn Sie die Absicht, wieder Wurf ist, der richtige Code ist:

catch (System.Exception ex) 
    { 
     throw; 
    } 
+0

Ich habe die Frage aktualisiert, für weitere Details – Elnaz

+0

Das ändert meine Antwort nicht. Ich sehe keinen Wert beim Filtern nach dem Ausnahmetyp. –

+0

@PauloMorgado ist korrekt, wenn die Ausnahme nur zurück in die UI-Ebene geworfen wird, wird die Stack-Ablaufverfolgung nicht zurückgesetzt und dies ist der bevorzugte Ansatz für mehrschichtige .NET-Anwendungen. –