Hallo zusammen,
ich bin neu in C#, und brauch eine Orientierungshilfe.
Ich habe ne grundlegende Frage. Ich rufe eine Methode einer Klasse auf (Button-Click), die ich in einer anderen Klasse in einem try - catch Handler behandle. In dem catch Block fang ich die Error-Message ab. Lieg ich grundsätzlich richtig, dass ich ein EREIGNIS auslösen muss (oder will), wenn die Methode einen Fehler erzeugt?
Danke für jeden Tipp.
Katja
moin,
sorry aber deine Frage ist mir nicht ganz klar?
könntest du dein Problem(frage) mal etwas genauer beschreiben?
mfg
Das Event button_Click wird nur ausgeführt wenn du auf den Button klickst 🙂
ist, dass ich nicht genau weiss, ob meine Denke korrekt ist.
Ich möchte nur dann ein Ereignis auslösen, wenn die Methode, die ich aufrufen will, einen Fehler erzeugt.
Muss ich da in der Klasse, die die Methode enthält, einen Evenhandler reinbaun, und der wird dann in der Aufrufklasse instanziiert???
Ist da das Erzeugen eines Events "FehlerWurdeErzeugtEvent" der richtige Ansatz?
Hi,
also wenn ich dich richtig verstanden habe möchtest du ein Ereignis im Fehlerfall auslösen.
Dort wo du deinen Try / catch hast, kannst du natürlich deinen Fehler direkt abfangen oder auch ein beliebeiges Ereignis auslösen...
In der übergeordneten Funktion, Klasse... müsstest du über eine Abfrage feststellen, ob das Ereignis ausgelöst werden soll und das könntest du dann machen indem du den Befehl throw benutzt.
Beispiel:
Aufruf deiner Funktion (bool)
Abfrage / Wenn true dann nichts, ansonsten throw new exception ...
Vielleicht hilft dir das.
Wäre möglich! Entweder du wirfst in deiner anderne Klasse einen Event, und fängst ihn z.b in der Formklasse. Anders rum könntest du aber auch einfach ne Exception werfen, und diese dann abfangen im Button_Click
public void button_Click(...)
{
try
{
deineMethodeWelcheExceptionWerfenKann();
}catch(DeineException ex)
{
Messagebox.Show(ex.Message);
}
}
.unreal
... ich bin wahrscheinlich echt zu doof, mich da auszudrücken.
Das Ereignis möchte ich in der Klasse, in der ich die Methode aufrufe.
Weil - der Benutzer der Aufrufklasse sich um das Fehlerhandling net kümmern soll.
Events/Delegates sind doch bereitgestellt.
Naja,
Danke.
Original von katja71
Das Ereignis möchte ich in der Klasse, in der ich die Methode aufrufe.
Weil - der Benutzer der Aufrufklasse sich um das Fehlerhandling net kümmern soll.
Des verwirrt mich grad Willst du nun dass der Aufrufer den Fehler mitbekommt oder nicht.
Weil erster Satz hört sich für mich so an: Objekt A instanziert Objekt B und ruft B.X() auf, in X kommt ne Exception und A bekommt über nen Event mit das dort ein Fehler aufgetreten ist.
Und zweiter Satz hört sich für mich an dass A nicht mitbekommt das in B.X() was schiefgelaufen ist, sondern das Event nur intern in B benutzt werden soll.
Im ersten Fall wirfst du einfach im Catch Block das Event, so wie man halt normal Events erzeugt. Im zweiten Fall musst du gar nichts mit Events machen, da du doch eh weißt dass was schiefgegangen ist wenn du im Catch Block landest. Da musst du deine Klasse net extra benachrichtigen wenn das eh net nach außen geht.
Oder hab ich da grad was voll missverstanden?
Baka wa shinanakya naoranai.
Mein XING Profil.
Also, ich versuche es nochmal.
Meine Klasse CArtikel hat folgende Methode:
[CSHARP]
public void Write2Xml(Artikelart art,string exportPath,string dbName)
{
try
{
_exportPath = exportPath;
_dbName = dbName;
_ds = new DataSet();
_xmlExport = new CXmlExport(_ds, _exportPath,_dbName);
_mySql= "SELECT xxx";
switch (art)
{
case Artikelart.Verkauf: // Verkauf
_mySql = _mySql + " where StatistikCodeID3=2";
_da = new OleDbDataAdapter(_mySql, _ConnString);
_da.Fill(_ds, "Verkaufsartikel");
_xmlExport.WriteXmlFile();
break;
case Artikelart.Lager: // Lager
_mySql = _mySql + " where StatistikCodeID3=1";
_da = new OleDbDataAdapter(_mySql, _ConnString);
_da.Fill(_ds, "Lagerartikel");
_xmlExport.WriteXmlFile();
break;
default: // alle Artikel
_da = new OleDbDataAdapter(_mySql, _ConnString);
_da.Fill(_ds, "Artikel");
_xmlExport.WriteXmlFile();
break;
}
}
catch
{
_xmlExport.ErrorMessage.ToString();
}
}
Ich rufe die Methode aus dem Hauptprogramm aus auf:
private void XmlExportLager(object sender, EventArgs e)
{
CArtikel art = new CArtikel(_ConnString);
art.Write2Xml(CArtikel.Artikelart.Lager, _PathSaveTo, _Db_Name);
}
Ich möchte nur im Fehlerfall die Errormessage ausgeben. Muss ich das unbedingt in einem try - catch Handler in der aufrufenden Klasse machen, oder kann ich mit einem delegate oder event arbeiten ...
Katja
Hallo katja71,
das ist kein Job für Events! Was du brauchst, ist normales Exception-Handling. Eine Exception abzufangen und stattdessebn einen Event auszulösen, ist i.d.R. quasch. Im einfachsten Fall fängst du die Exception einfach nicht, sondern lässt sie vom Aufrufer fangen. Dadurch, dass eine Exception auftritt, wird der Aufrufer ja auch "benachtichtigt".
herbivore
danke.
Ich wusst halt nicht, wo man das am schlausten einbaut. In der Aufruferklasse, oder in der Klasse direkt.
Katja
Je nachdem 🙂 Wenn die Aufruferklasse weiterarbeiten kann, selbst wenn die Funktion fehlschlägt, dann würde ich das Exceptionhandling direkt in der Funktion machen, wenn die Aufruferklasse aber dann selbst in einen Fehlerzustand fällt muss die dann das Exceptionhandling übernehmen.
Baka wa shinanakya naoranai.
Mein XING Profil.