DennisXX - Mo 07.11.11 10:55
Titel: Frage zu 3 Tier Architektur
Hallo !
Kann mir vielleicht jemand von euch sagen, wie es in einer 3 Tier Architektur (welche ich mit C Sharp umsetze) möglich ist, eine Exception die z.B. von der untersten Schicht (in dem Fall die Data Access Layer Schicht) ausgelöst wurde, an die obereste Schicht (die Presentation Schicht) weiterzureichen, so dass sie dort in einem Textfeld oder Labelfeld dem benutzer angezeigt wird?
Bisher löse ich das so mit den Exceptions in den einzelnen Methoden der entsprechenden Schicht, aber ich versteh noch nicht so ganz, wie ich sie an die oberen Schichten weiterreichen kann, da ja Sinn und Zweck der 3 Tier Architektur der ist, dass nur jeweils die jeweils untere Schicht bekannt ist.
C#-Quelltext
1: 2: 3: 4:
| catch(Exception e) { throw e; } |
//Edit
Oder die Frage könnte auch allgemeiner formuiliert werden. Wie kann ich allgemein Werte aus einer unteren Schicht an die jeweilige höhere Schicht weiterreichen und dann wiederum an die nächste usw.?
Grüße
Dennis
Moderiert von
Th69: Topic aus C# - Die Sprache verschoben am Mo 07.11.2011 um 11:03
Trashkid2000 - Mi 09.11.11 22:16
Hallo,
richtig ist, dass man Exceptions dort fangen soll, wo man sie behandeln kann.
Muss man im Fehlerfall noch Aktionen ausführen, will aber trotzdem die "Nachricht", dass ein Fehler aufgetreten ist (bzw. was für ein Fehler) nicht "verlieren", so muss man sie weiterschmeißen. Auf gar keinen Fall sollte man sie irgendwo einfach verschlucken!!
Der gepostete Code macht so keinen Sinn, da Du die Exception ohne eine Aktion weiterschmeißt. Ausserdem sollte man nur den Befehl
throw; verwenden, um den Stacktrace nicht zu verfälschen. Also so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| try { string[] lines = File.ReadAllLines(@"C:\test.txt") } catch(FileNotFoundException) { throw; } |
Zu Deiner eigentlichen Frage: wenn Du die Exception nicht behandelst oder immer weiterschmeißt, so wird sie bis zur obersten Schicht (also der Applikation) durchgereicht.
Nicht vergleichen sollte man Exceptions mit Events. Das sind zwei verschiedene Paar Schuhe (wenn ich mich irgendwie irre, dann bitte berichtigen).
Denn so wie es
pdelvo geschrieben hat hört sich das an, als ob man quasi im Fehlerfall aus einem Objekt ein Event feuert, und auf das Event dann in dem aufrufenden Objekt "horcht", dann vielleicht wieder ein Event feuert... Und was, wenn ein Objekt nicht auf das Event horcht???
Soviel erstmal,
LG,
pdelvo - Mi 09.11.11 22:42
Events war auf seine Generelle Frage bezogen. Was mir jetzt für solch einen Fall einfallen würde:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| public class ExceptionEventArgs : EventArgs { public Exception ExceptionObject{get;private set;} public bool Handled{get;set;} public ExceptionObject(Exception exception) { ExceptionObject = exception }; }
public class Wasweissich : INotifyPropertyChanged { public void DoSomethingExpensive() { ThreadPool.QueueUserWorkItem(new WaitCallback((o)=> { try{ int t = 0; int complex = 1 / t; }catch(Exception ex){ ExceptionEventArgs e = new ExceptionEventArgs(ex); if(ExceptionOccured != null) ExceptionOccured(this, e); if(!e.Handled) ... }
}); }
public event EventHandler<ExceptionEventArgs> ExceptionOccured; ... } |
PS: Das ganze ist direkt hier in den Editor getippt. Dürfte aber stimmen wenn ich mich nicht allzusehr vertippt habe