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?
Warum nicht 'catch (System.Exception ab), wenn (ex ist ExcOneException))'? In jedem Fall solltest du 'catch (ExconeException ex) {...}' machen. – Enigmativity
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
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