Laden...

Ereignis auslösen

Erstellt von katja71 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.651 Views
K
katja71 Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren
Ereignis auslösen

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

2.223 Beiträge seit 2005
vor 17 Jahren

moin,

sorry aber deine Frage ist mir nicht ganz klar?

könntest du dein Problem(frage) mal etwas genauer beschreiben?

mfg

S
6 Beiträge seit 2006
vor 17 Jahren

Das Event button_Click wird nur ausgeführt wenn du auf den Button klickst 🙂

K
katja71 Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren
Mein Problem

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?

M
11 Beiträge seit 2006
vor 17 Jahren

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.

563 Beiträge seit 2004
vor 17 Jahren

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

K
katja71 Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren
Hm

... 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.

6.862 Beiträge seit 2003
vor 17 Jahren

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.

K
katja71 Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

K
katja71 Themenstarter:in
46 Beiträge seit 2006
vor 17 Jahren
Ok

danke.
Ich wusst halt nicht, wo man das am schlausten einbaut. In der Aufruferklasse, oder in der Klasse direkt.
Katja

6.862 Beiträge seit 2003
vor 17 Jahren

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.