Autor Beitrag
DennisXX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Mo 07.11.11 10:55 
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.

ausblenden 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 user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mo 07.11.2011 um 11:03
pdelvo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 11



BeitragVerfasst: Di 08.11.11 00:03 
user profile iconDennisXX hat folgendes geschrieben Zum zitierten Posting springen:
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.

ausblenden 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 user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mo 07.11.2011 um 11:03


Events. Generell sollten Exceptions dort gefangen werden, wo man sie behandeln kann
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
try
{
  string[] lines = File.ReadAllLines(@"C:\test.txt")
}
catch(FileNotFoundException)
{
  //mache irgendwas 
  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 user profile iconpdelvo 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 11



BeitragVerfasst: Mi 09.11.11 22:42 
Events war auf seine Generelle Frage bezogen. Was mir jetzt für solch einen Fall einfallen würde:
ausblenden 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)=> //In den Background, um zu simulieren, dass man die Excepion nicht einfach weiterschmeissen kann
           {
                 try{
                int t = 0;
                int complex = 1 / t;//kommt immer gut
                }catch(Exception ex){
                       ExceptionEventArgs e = new ExceptionEventArgs(ex);
                       if(ExceptionOccured != null) ExceptionOccured(this, e);
                       if(!e.Handled) ... //Programm beenden, loggen, irgendjemand beleidigungen an den Kopf werfen, o.Ä.
                }

           });
     }


     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